python подпроцесс ‘ssh’ не возвращает такой файл или каталог

#python #python-3.x #subprocess #azure-functions

#python #python-3.x #подпроцесс #azure-функции

Вопрос:

Когда я запускаю этот подпроцесс локально, он работает, однако, когда я развертываю его в функции Azure, он возвращает

(2, «Нет такого файла или каталога»)

 subprocess.run(['ssh', f'{user}@{host}', cmd],
                                    stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE,
                                    check=True)
  

Стек ошибок из azure:

 Exception while executing function: Functions.AxesSearchApi Result: Failure
Exception: FileNotFoundError: [Errno 2] No such file or directory: 'ssh'
Stack:   File "/azure-functions-host/workers/python/3.8/LINUX/X64/azure_functions_worker/dispatcher.py", line 347, in _handle__invocation_request
    call_result = await self._loop.run_in_executor(
  File "/usr/local/lib/python3.8/concurrent/futures/thread.py", line 57, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/azure-functions-host/workers/python/3.8/LINUX/X64/azure_functions_worker/dispatcher.py", line 511, in __run_sync_func
    return func(**params)
  File "/home/site/wwwroot/AxesSearchApi/__init__.py", line 29, in main
    sshProcess = subprocess.run(["ssh", f'{user}@{host}', cmd],
  File "/usr/local/lib/python3.8/subprocess.py", line 489, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/local/lib/python3.8/subprocess.py", line 854, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/local/lib/python3.8/subprocess.py", line 1702, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
  

Комментарии:

1. Вероятно, он не может найти ssh команду…

2. Возможно, он не может найти локальный ssh или, возможно, вы видите ошибку с удаленного хоста, которую он не может найти cmd . Вы можете запустить [ какой , ssh ] , чтобы узнать о первом. И, возможно ['ssh', f'{user}@{host}', 'which', cmd] , для последнего. Было ли сообщение большего размера, которое вы урезали для нас? Было бы неплохо посмотреть, было ли это локальным исключением python или чем-то удаленным.

3. Мне удалось перехватить это исключение только из python, azure вернул другой стек, но не связанный. я собираюсь добавить больше протоколирования

Ответ №1:

рабочие функции Azure намеренно тонкие, обычно в образе, на котором они развертываются, отсутствуют какие-либо второстепенные инструменты

похоже, что изображение python 3 не содержит ssh двоичного файла

вероятно, вы можете создать пользовательский образ на основе docker вместо использования готовых изображений и установить ssh в него