2015-04-06 5 views
0

Итак, я пытаюсь передать параметры сценарию оболочки bash через соединение сокета TCP-протокола python. Сценарий, выполняемый в оболочке bash, всегда срабатывает, хотя при печати переменной, передаваемой в os.system() или subprocess.call(), она выглядит правильно. Есть идеи? Небольшой кусок кода, который дает мне проблемы.Использование данных, полученных из сокета TCP [python]

while 1: 
    conn, addr = s.accept() 
    print 'Connected with ' + addr[0] + ':' + str(addr[1])  
    data = conn.recv(1024) 
    if not data: 
     break 
    data2 = data.rstrip('\n') 
    cmd = 'ls ' + data2 
    #os.system(cmd) 
    subprocess.call([cmd], shell=True) 
    print cmd 
+0

Вы должны быть конкретными о том, как он «бомбит». Что происходит, точно? –

+0

Аналогичный вопрос [здесь] (http://stackoverflow.com/questions/15869158/python-socket-listening/16512082#16512082) – Noelkd

+0

Hi Brian, Программа может найти двоичный файл и успешно запускать его в оболочке bash, однако, когда пытаясь добавить параметры для передачи в двоичный файл bash, двоичный код не правильно интерпретирует параметры, заставляя его возвращать код ошибки, запрограммированный на «недопустимый параметр» Использование «ls» в качестве примера: работает «ls» "работает, прохождение" -l "к нему не удается , когда я печатаю переменную cmd, она возвращает то, что я ожидаю работать" ls -l " – user2740987

ответ

1

Питона subprocess call (doc) занимает одну строку, чтобы выполнить или список аргументов. Вы передаете строку как один аргумент, и, таким образом, вся вещь интерпретируется как команда для выполнения, которая, конечно, не может быть найдена.

subprocess.call(cmd, shell=True) или subprocess.call(['ls', data2])

Последнее является предпочтительным, поскольку это означает, что злоумышленник вызывающий абонент не может создавать произвольные действия оболочки, передавая «Foo; гт -rf/&» вниз гнездо.

Примечание: лучше использовать call(('ls', data2)) (круглые скобки вместо скобок), чтобы создать простой «кортеж» Python, а не динамический список для перехода к call(...).

+0

Hi Bran, Спасибо за мысли! Я попробую это и дам вам знать мои результаты. – user2740987

+0

Hi Brian, Попытка вашего предложенного метода 'subprocess.call (('ls', data2))' оставляет меня еще немного сломанным. Мой выход: Связано с 127.0.0.1:36085 's: недействительный вариант - ' Попробуйте 'ls --help' для получения дополнительной информации. Если я выберу соединение сокета из уравнения и просто попробую передать параметры сценарию из статически назначенных переменных, он отлично работает. Я думаю, что есть какое-то отношение к тому, как создается переменная, содержащая информацию, переданную через сокет. – user2740987

+0

Каково значение 'data2'? Он начинается с тире? Кроме того, вы написали «s: недопустимый параметр -« ... это должно было быть «ls: invalid option»? Сокеты представляют собой сырые 8-битные соединения, если вы передаете точные символы, которые составляют имя файла назначения, все должно быть хорошо. –

Смежные вопросы