Вызов удаленного интерактивного скрипта Python из скрипта bash: задержка запроса ввода

Я написал сценарий bash, который в какой-то момент автоматизирует установку некоторого программного обеспечения на удаленном хосте, например:

ssh user@remotehost "<path>/install-script"

Где install-script — скрипт bash. Этот скрипт bash в какой-то момент вызывает другой скрипт bash, который в какой-то момент вызывает интерактивный скрипт python, который затем использует функцию raw_input() python для сбора пользовательского ввода.

Когда я запускаю сценарий установки в обычном режиме (из оболочки bash), он запрашивает ввод и принимает его без проблем. Однако, когда приведенный выше фрагмент кода из моего скрипта запускается, я не получаю подсказки до тех пор, пока не введу ввод.

Единственный сценарий, который я действительно могу контролировать, — это мой сценарий автоматизации.

Я прочитал этот вопрос: «Python - как я могу прочитать стандартный ввод из оболочки и отправить стандартный вывод в оболочку и файл." Однако у меня нет проблем с запуском в обычной оболочке bash, только с помощью удаленной команды через ssh.

Можно ли решить эту проблему из моего скрипта (и если да, то как?), или мне придется изменить скрипт python?

ОБНОВЛЕНИЕ

Чтобы уточнить, подсказки ввода, о которых я говорю, — это подсказки из скрипта Python. Я не ввожу пароль для ssh (на удаленном хосте есть мой открытый ключ в файле authorized_keys).

ОБНОВЛЕНИЕ

Для дальнейшего пояснения, мой сценарий (bash) вызывает сценарий установки (bash), который вызывает другой сценарий bash, который, наконец, вызывает сценарий python, который запрашивает ввод данных пользователем.

то есть bash -> bash -> bash -> python


person rom58    schedule 22.01.2014    source источник
comment
Вам нужно использовать subprocess.Popen или ssh lib для достижения входной части.   -  person Torxed    schedule 22.01.2014
comment
Что-то вроде кода в моей проблеме: stackoverflow.com/questions/20472288/   -  person Torxed    schedule 22.01.2014
comment
Я знаю, однако код в моей проблеме обрабатывает ввод/вывод скрипта через SSH. Обратите внимание на elif 'are you sure you want to continue connecting' in lower:, который является примером того, когда я возвращаю ввод в удаленную подсказку. Я использовал его в сценариях удаленной установки, требующих некоторого действия/ввода от пользователя.   -  person Torxed    schedule 22.01.2014
comment
Итак, вы говорите, что мне придется изменить скрипт python (тот, который запрашивает), а не мой скрипт bash?   -  person rom58    schedule 22.01.2014
comment
Возможно, я что-то перепутал, я предположил, что вызывающим скриптом был Python, а удаленным скриптом был bash-›bash-›python. Но вы говорите, что ваш сценарий вызова - bash?   -  person Torxed    schedule 22.01.2014
comment
да. Извините, я обновил свой вопрос (я забыл указать, какой у меня сценарий).   -  person rom58    schedule 22.01.2014


Ответы (1)


ssh user@remotehost "<path>/install-script"

Когда вы запускаете ssh и указываете команду для вызова в удаленной системе, по умолчанию ssh не будет выделять PTY (псевдо-TTY) для удаленного сеанса. Это означает, что вы будете взаимодействовать с удаленным процессом через набор каналов вместо TTY.

При записи в канал программы unix обычно буферизуют свои операции записи. Вы не увидите вывод, записанный в канал, до тех пор, пока процесс, записывающий в канал, не очистит свой буфер или когда он выйдет, потому что буферизованный вывод обычно сбрасывается при выходе. Кроме того, процесс может определить, пишет ли он в файл, канал или терминал, и может изменить свое поведение. Например, такая оболочка, как bash, не будет печатать командные строки при чтении команд из канала.

Вы можете заставить ssh запрашивать TTY для сеанса, используя опцию -t:

ssh -tt user@remotehost "<path>/install-script"

Дополнительные сведения см. на ssh man-странице.

person Kenster    schedule 28.11.2017