Как работать с "Псевдо-терминал не будет выделен, потому что stdin не является терминалом".
ssh -t remotehost vim /tmp/x.txt
Я знаю, что могу выполнить команду, подобную приведенной выше.
Но я хотел бы иметь возможность запускать любой локальный код Bash на удаленной машине. По этой причине я хотел бы вызвать удаленный bash -s, чтобы он мог обрабатывать любой локальный код bash.
ssh -t remotehost 'bash -s' <<< vim /tmp/x.txt
Однако вышеприведенный пример показывает, что "псевдотерминал не будет выделен, потому что stdin не является терминалом". Есть ли способ позволить ssh взять локальный код bash через stdin и запустить его через удаленный bash -s? Благодарю.
2 ответа
ssh -t remotehost 'bash -s' <<< vim /tmp/x.txt
Вы получаете сообщение "Псевдо-терминал не будет выделен...", потому что вы запускаете ssh с одним -t
вариант, когда стандартный ввод для процесса ssh не TTY. ssh печатает это сообщение специально в этом случае. Документация для -t гласит:
-t
Принудительное псевдо-терминальное размещение. Это может использоваться для выполнения произвольных программ на экране на удаленном компьютере, что может быть очень полезно, например, при реализации сервисов меню. Несколько опций -t принудительно распределяют tty, даже если ssh не имеет локального tty.
-t
Параметр командной строки связан с параметром конфигурации ssh RequestTTY:
RequestTTY
Указывает, следует ли запрашивать псевдотерминал для сеанса. Аргумент может быть одним из: no (никогда не запрашивать TTY), yes (всегда запрашивать TTY, когда стандартным вводом является TTY), force (всегда запрашивать TTY) или auto (запрашивать TTY при открытии сеанса входа в систему). Эта опция отражает флаги -t и -T для ssh(1).
Один -t
эквивалентно "RequestTTY yes", а два из них эквивалентны "ForceTTY force".
Если вы хотите, чтобы ваши удаленные команды запускались с TTY, укажите -t
дважды:
ssh -tt remotehost 'bash -s' <<< vim /tmp/x.txt
or
ssh -t -t remotehost 'bash -s' <<< vim /tmp/x.txt
ssh выделит TTY для удаленной системы и не будет печатать это сообщение.
Если команда (и), выполняемая в удаленной системе, не требует TTY, вы можете оставить -t
вариант из:
ssh remotehost 'bash -s' <<< vim /tmp/x.txt
Я считаю, что следующее может соответствовать вашим целям:
vim /tmp/x.txt ; ssh remotehost 'bash -s' < /tmp/x.txt
Первое выражение (vim ...
) позволяет указать команды, которые вы хотите выполнить удаленно, в виде локального файла с именем /tmp/x.txt
; второе выражение (ssh ...
) вызывает удаленный интерпретатор bash и отправляет в него содержимое вашего локального файла. Обратите внимание, что вам не нужно -t
вариант для ssh
в этом случае (что привело к появлению псевдотерминального предупреждения), и что вам не нужно использовать строку здесь (<<<
) но можно использовать обычный оператор ввода файлов (<
).
Это решение работает, например, для следующего содержимого файла:
echo These commands are being executed on $HOSTNAME
echo This is a second command