Ошибка Python при использовании подпроцесса без shell = false и переменной из массива - PullRequest
0 голосов
/ 03 марта 2019

У меня есть фрагмент кода, который работает с shell = True, который не является безопасным, и когда я пытаюсь удалить shell = True и включить shell = False, ошибки программы выходят

Код ниже:

cmd = "git clone https://github.com/{} &"    
#define a worker function
def worker():
    while True:
        item = q.get()
        subprocess.Popen(cmd.format(item))
        q.task_done()

Я получаю сообщение об ошибке ниже:

File "rapid.py", line 56, in worker
    subprocess.Popen(cmd.format(item))
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 775, in __init__
    restore_signals, start_new_session)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/subprocess.py", line 1522, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'git clone https://github.com/laramies/theHarvester.git &': 'git clone https://github.com/laramies/theHarvester.git &'

если я добавлю shell = True в строку подпроцесса, он будет работать нормально (см. Ниже), но затем код-фактор помечает его как небезопасный код.Любой способ сделать это без shell = true?

cmd = "git clone https://github.com/{} &"    
#define a worker function
def worker():
    while True:
        item = q.get()
        subprocess.Popen(cmd.format(item), shell = True)
        q.task_done()

1 Ответ

0 голосов
/ 03 марта 2019

Команда передается на subprocess.Popen в виде строки.Это работает при использовании shell=True, потому что оболочка может принять команду в виде одной строки.Но когда shell=False, Popen ожидает команду в виде списка аргументов, первым из которых является полный путь запуска программы.(Предполагается, что вы работаете на компьютере с POSIX, а не с Windows.)

По сути, код гласит: «Запустите программу с именем git clone https://github.com/laramies/theHarvester.git без аргументов» вместо «Запуск git с аргументами * 1008».* и https://github.com/laramies/theHarvester.git ".

& также следует удалить, потому что это особенность оболочки, а с shell=False он будет передан git в качестве аргумента, который он не поймет.Хотя вам это не нужно, поскольку процесс все равно будет работать в фоновом режиме.

Примерно так должно работать:

subprocess.Popen(["/usr/bin/git", "clone", "https://github.com/{}".format(item)])

Более подробная информация здесь: https://docs.python.org/3.7/library/subprocess.html#popen-constructor

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...