2015-08-25 2 views
1

Я пытаюсь передать последовательность команд сценария оболочки функции python.Как передать скрипт оболочки, который живет в переменной, к функции

Я использовал для вызова файла script.sh внутри подпроцесса, но теперь я хотел бы иметь сам скрипт в функции, поэтому мне не нужно беспокоиться о трейлинг-скрипте.

упрощен пример, чтобы дать представление:

def myfunc() 
    script = "ls -la; cd /; ls -la" 
    runscript_output = subprocess.call(script) 
    print runscript_output 

Является ли это правильный способ сделать это?

Я видел несколько примеров, когда команды оболочки были обернуты в обертки EOF; хотя я не совсем уверен, почему.

+0

Re: «Обертки EOF», возможно, это был другой язык - Python не поддерживает heredocs. –

+1

Обертки EOF, вероятно, были переадресованы. Вы должны заставить вашу функцию принять команду в качестве аргумента, чтобы вы могли использовать ее в другом месте. – MeetTitan

+0

@CharlesDuffy: пример использовал его в строке, запущенной в функции python; что-то вроде string = "cat << 'EOF' >>" или что-то в этом роде; Я считаю, что это синтаксис сценария оболочки –

ответ

0

Использовать shell=True в этом прецеденте. Кроме того, я настоятельно рекомендую сделать свой сценарий текст константу, и толкая любые переменные подстановки в виде отдельных аргументов:

script_text=r''' 
ls -la 
cd "$1" || exit 
ls -la 
''' 

# for /bin/sh 
def myfunc_sh(): 
    runscript_output = subprocess.check_output(
     [script_text,  # /bin/sh script text here 
     '/'],    # add values for $1 and on as list elements 
     shell=True) 
    print runscript_output 

# for /bin/bash 
def myfunc_bash(): 
    runscript_output = subprocess.check_output(
     ['bash',   # interpreter to run 
     '-c', script_text, # script to invoke 
     '_',    # value for $0 
     '/'])    # add values for $1 and on as extra list elements here 
    print runscript_output 

После этой практики - хранение содержания передается в оболочку как текст сценария константа - избегает открытий вас до уязвимостей инъекций оболочки, в которых данные анализируются как код.

+0

Очень ценим Чарльза; это в основном код, выполняемый локально в моем пакете синтаксического анализа; Я хватаю тонну журналов с выхода спектрометра и выполняю на них операции, поэтому я бы сказал, что риск инъекции вредоносного кода довольно низок. Дайте ему попробовать! –

+0

Что-то не должно быть намеренно злонамеренным бросить ключ в работу. У одного из моих бывших работодателей мы потеряли несколько ТБ данных фактурирования после переполнения буфера, бросив поток случайного мусора, включая окруженную пробелами звездочку в имя файла, и плохо написанный сценарий (в котором его автор оставил некоторые другие ссылки - необходимые кавычки) пытались удалить этот файл. –

+1

Кстати, обратите внимание, что все, что вы запускаете с 'shell = True', будет вызываться с помощью'/bin/sh', а не 'bash' или' ksh' или whatnot. Таким образом, вы можете вместо этого рассмотреть что-то вроде '['bash', '-c', script_text, '-s'] + argument_list', если вы хотите написать свой код для выполнения более способной оболочки. –

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