LINUX.ORG.RU
ФорумAdmin

Запуск python скрипта с параметрами из bash

 , , ,


0

2

Добрейшего дня! Трабл. Есть скрипт ip-up, который отрабатывает при подключении pptp-клиента. Есть скрипт, назову его условно connect, которому передаются параметры от ip-up. Скрипты на bash. Все прекрасно работает. Возникла необходимость переписать bash-скрипт на python3. Скрипт умеет принимать параметры. Проблем тут нет. Проблема возникает когда, я пытаюсь передать параметры от ip-up. То есть connect(bash) принимает параметры, а connect(python) не воспринимает их. Если запускаю вручную в терминале (debian 8):

python3 ./connect.py parametr1 parametr2 parametr3
Все четко. Добавил в код вывод значений передаваемых параметров в файл. Все красиво выводится. Вывод: скрпт работает. Ок! В скрипте ip-up добавляю строку на запуск моего скрипта. Вангую гневные комменты. Да, я знаю, есть папочка ip-up.d. Оттуда скрипты запускаются сами при коннекте. В данном случае не принципиально. На bash скрипт прекрасно запускался и путем прописывания команды на его запуск прямо в ip-up скрипте с параметрами. Дак вот, подшаманил скрипт на питоне, чтобы тот признаки жизни подавал при старте и получается картина такая. Клиент подключается -> стартует ip-up и запускает скрипт python c параметрами-> стартует скрипт python, доходит до места где параметры заносятся в переменные и встает. Повторюсь, ip-up скрипт точно передает параметры. Проверено на другом принимающем их скрипте, но на bash. Python-скрипт понимает параметры. При ручном запуске скрипта, он успешно отрабатывает. Проблема, что автоматически эта конструкция не работает у меня. Есть идеи? Спасибо!


Ну добавь логирования в скрипт, убедись что параметры действительно имеются. Попробуй перекатись на переменные среды.

Deleted
()
Ответ на: комментарий от I-Love-Microsoft

Ща, господа, сбацаю пару простых скриптов. Для понимания сути просто. Немножко времени дайте...

kerby
() автор топика
Ответ на: комментарий от bvn13

Абсолютно стандартный скрипт ip-up из /etc/ppp. В него в конце добавлена строка:


/home/kerby/Scripts/connectpy $PPP_PAR1 $PPP_PAR2 $PPP_PAR3

Cкрипт на python:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
from sys import argv
if len(argv) > 1:
    myPAR1 = argv[1]
    myPAR2 = argv[2]
    myPAR3 = argv[3]
else:
    print("Параметров не передавалось")
Примитивно получилось, но вот как-то так. Обращаю внимание, что пробовал я и напрямую файл .py запускать из ip-up.

kerby
() автор топика
Ответ на: комментарий от kerby

что за $PPP_PAR1? Вы его содержимое проверяли? там всю жизнь были $0 $1 $2 и т.д.

keir ★★
()
Ответ на: комментарий от ashot

объясняю. Есть два варианта. Оба работают одинаково. 1. python3 connect.py 2. файл без py. Первой строкой #!/bin/python3

kerby
() автор топика
Ответ на: комментарий от kerby

На всякий случай уточню:

chmod +x /home/kerby/Scripts/connectpy
тоже делалось?

Первой строкой #!/bin/python3

Надеюсь все-таки #!/usr/bin/python3

ashot ★★★★
()
Ответ на: комментарий от ashot

1. Да 2. Да=) и кавычки `` для строки пробовал. Не понимаю в чем проблема. Если делаю echo в файл и потом строку из файла копирую, вставляю в консоль. Жму enter - чудеса и все работает.

kerby
() автор топика
Ответ на: комментарий от ashot

Творятся чудеса. Нащупал нить. Отпишусь по результатам.

kerby
() автор топика
Ответ на: комментарий от ashot

Пошел путем от простого к сложному. Один скрипт на bash запускает скрипт на python и передает ему параметры.

#!/bin/bash
python3 ./test.py 1 2 3
#так тоже пробовал:
#`/usr/bin/python3 /home/kerby/proba/test.py 1 2 3`
И Python (test.py)
# -*- coding: utf-8 -*-
from sys import argv

par1 = argv[1]
par2 = argv[2]
par3 = argv[3]

my_file = open("/home/kerby/proba/good.txt",'w')
my_file.write("Переданы параметры: %s, %s, %s" %(par1, par2, par3))
my_file.close()
В результате в файл должны быть записаны переданные bash скриптом параметры (1, 2, 3). ВНИМАНИЕ! Запускаю bash. И все работает. Файл создается, параметры в него пишутся. Ну ОК, думаю. Пихаю строчку запуска в ip-up. Заостряю внимание на том, что сейчас никаких переменных в bash нет. Я тупо передаю 1, 2 и три. И Да, раз, два, три я тоже пробовал. Итак, запускаю самостоятельно скрипт ip-up. Файл good создается параметры есть в нем. Делаю реконнект клиента для автоматического срабатывания ip-up. C**А!!!! Файл good.txt создан. НО ОН ПУСТОЙ. ЧТО ТЫ ТАКОЕ???!!!CHMOD какой-то. P.S. chmod +x делал. Мэй би кодировка?

kerby
() автор топика
Ответ на: комментарий от bvn13

Я все-таки склоняюсь, что проблема в кодировке. А можно как-то в режиме отладки запустить скрипт и вывести инфу в файл?

kerby
() автор топика
Ответ на: комментарий от kerby

Знаешь, когда я бодался с запуском python скрипта из крона, то выяснилось, что environment в таком случае для питона - голый. Пришлось прописать все нужное вручную. Может быть, в этом дело?

bvn13 ★★★★★
()
Ответ на: комментарий от ashot

Сейчас уже упростил задачу вовсе. Скрипт просто записывает в файл текстовый строку. Без каких-либо переменных. Ручной запуск работает. При вызове через ip-up файл создается, но пустой. Скрипт лежит в /etc/ppp/ip-up.d/. В скрипте прописан интерпретатор питона первой строкой. Он исполняемый. Т.е. дабл-клик по нему и все - файлик есть. В файлике строка. При коннекте клиента скрипт успешно стартует. Создает файл, но пустой. Судя по всему действует так сам ip-up. Пытаюсь выяснить почему :(

kerby
() автор топика
Ответ на: комментарий от ashot

т.е. скрипт ip-up сейчас оригинальный, без коррективов. Если его запустить в mc руками, то скрипт python из папки ip-up.d срабатывает как надо. Создает файл со строкой внутри.

kerby
() автор топика
Ответ на: комментарий от ashot

что только не пробовал. Уже через вызов внешней программы, которая запускает скрипт и передает ему параметры. Суть такова. Скрипт запущенный в любом месте и любым образом работает. При запуске с использованием ip-up действуют некие ограничения ввода/вывода, которые мешают корректной работе скрипта.

kerby
() автор топика
Ответ на: комментарий от ashot

https://wiki.debian.org/ru/pptp-linux

«Имеются следующие ограничения на /etc/ppp/ip-up:

Для усиления защиты он выполняется в преднамеренно ограниченном окружении. Это означает, что вы должны указывать полный путь к запускаемым файлам внутри скриптов и т.д. Технически /etc/ppp/ip-up - это программа, а не скрипт. Это означает, что он может быть всё таки выполнен - и следовательно, ему потребуется стандартный файл (#!/bin/bash) в начале первой строки скрипта, также он должен быть читаемым и исполняемым от пользователем root.»

Про полные пути понятно, А вот что конкретно таит в себе преднамеренно ограниченное окружение не совсем понятно. Но ограничения эти накладываются на все запущенные через ip-up скрипты и/или программы. Как я понял ввод/вывод происходит иначе, чем при ручном запуске скриптов. И дело тут нев правах и путях, а именно в самом принципе работы ip-up/down. Есть у кого какие мысли на этот счет? Не хочется переделывать python обратно на bash :(

kerby
() автор топика
Ответ на: комментарий от kerby

Поэтому и не воспринимает получается мой скрипт на python корректно параметры, которые передает ip-up и запись в файл не происходит.

kerby
() автор топика
Ответ на: комментарий от kerby

Попробовал набросать скрипт на lua. Получилось принять параметры от ip-up и даже в файл все красиво записалось. Никаких манипуляций не пришлось делать ни с правами, ни с кавычками. Буду переписывать скрипт на lua. Одна проблема, что я в нем пока не шарю. Придется разбираться сразу на практике. Самое время для быдлокода=))

kerby
() автор топика
Ответ на: комментарий от kerby

А вот что конкретно таит в себе преднамеренно ограниченное окружение не совсем понятно.

Не устанавливаются переменные окружения? Как их подтянуть в пистоне я хз.

ashot ★★★★
()
Ответ на: комментарий от ashot

В lua работает как надо. Ковыряюсь с переносом скрипта. Спасибо.

kerby
() автор топика
Ответ на: комментарий от ashot

Пистон - это смешно!:))))) Надо запомнить.

kerby
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.