Как работать с "Псевдо-терминал не будет выделен, потому что 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
Другие вопросы по тегам