Я имею дело со сценарием Python, который после некоторой подготовительной работы запускает ssh
. Мой скрипт на самом деле представляет собой небольшой инструмент CLI. В Unix-подобных системах в конце своего жизненного цикла сценарий Python заменяется клиентом ssh
, поэтому теперь пользователь может напрямую взаимодействовать с ssh
(т.е. запускать произвольные команды на удаленном компьютере и т. Д.):
os.execvpe('ssh', ['ssh', '-o', 'foo', 'user@host'], os.environ)
Положительный сюрприз и примечание на случай, если вам интересно: в Windows 10 действительно встроена собственная версия OpenSSH, поэтому на этой платформе есть команда ssh
.
os.execvpe
присутствует в стандартной библиотеке Python в Windows, но не заменяет исходный процесс (Python). Ситуация ... несколько сложная: 1, 2, 3. Итог: Windows не реализует соответствующую семантику POSIX для замены запущенного процесса.
Принято считать, что вместо этого следует использовать subprocess.Popen
, эффективно создавая дочерний процесс. Я могу запустить дочерний элемент, чтобы родитель продолжал работать, ИЛИ я могу запустить дочерний элемент, пока родитель умирает (я думаю, что Windows поддерживает последний, как и Unix-подобные системы). В любом случае пользователь не может взаимодействовать с дочерним элементом в командной строке.
Предполагая, что я сохраняю родителя в живых, теперь мне нужно написать тонну кода для передачи пользовательского ввода-вывода дочернему / от ребенка через родителя, например , например,. Последнее включает в себя управление потоками и даже потоками, в зависимости от того, насколько хорошо он должен себя вести - много мест для потенциальных проблем и поломок в будущем. Я не люблю этого делать (если можно этого избежать).
Как я могу эффективно заменить os.execvpe
в Windows в описанном сценарии?
РЕДАКТИРОВАТЬ (1): Части и части, которые могут иметь отношение ...
- Обработка наследования I
- Обработка наследования II
- STARTUPINFO в Windows
- STARTUPINFO в Windows - для Python
Я полагаю, это зависит от того, как правильно настроить объект STARTUPINFO
перед его передачей в Popen
. Фактически, командная строка может быть унаследована в Windows.
РЕДАКТИРОВАТЬ (2): частичное решение через pywin32
- ssh
открывается во втором новом окне cmd
, с которым можно взаимодействовать. Исходная оболочка с Python остается открытой, сам Python выходит:
from win32.Demos.winprocess import Process
from shlex import join
Process(join(['ssh', '-o', 'foo', 'user@host']))
ssh
вexpect
- это вариант ручного прохождения всех пользовательских операций ввода-вывода. В конце концов, это все еще довольно сложно, но спасибо за идею. - person s-m-e   schedule 12.05.2021