关于ssh:如何处理“由于stdin不是终端,因此不会分配伪终端”。

How to deal with “Pseudo-terminal will not be allocated because stdin is not a terminal.”

1
ssh -t remotehost vim /tmp/x.txt

我知道我可以执行上面这样的命令。

但我希望能够在远程机器中运行任何本地bash代码。出于这个原因,我想调用远程"bash-s",以便能够处理任何本地bash代码。

1
ssh -t remotehost 'bash -s' <<< vim /tmp/x.txt

但是,上面的示例显示"由于stdin不是终端,所以不会分配伪终端。"有没有任何方法可以让ssh通过stdin获取本地bash代码并通过远程"bash-s"运行它?谢谢。


1
ssh -t remotehost 'bash -s' <<< vim /tmp/x.txt

当ssh进程的标准输入不是tty时,您将收到"伪终端将不会被分配…"消息,因为您正在使用单个-t选项运行ssh。在这种情况下,ssh专门打印该消息。-t的文档显示:

-t
Force pseudo-terminal allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty.

-t命令行选项与ssh配置选项requesttty相关:

RequestTTY
Specifies whether to request a pseudo-tty for the session. The argument may be one of: no (never request a TTY), yes (always request a TTY when standard input is a TTY), force (always request a TTY) or auto (request a TTY when opening a login session). This option mirrors the -t and -T flags for ssh(1).

单个-t相当于"requesttty yes",而其中两个等同于"requesttty force"。

如果希望远程命令与tty一起运行,请指定-t两次:

1
2
3
ssh -tt remotehost 'bash -s' <<< vim /tmp/x.txt
or
ssh -t -t remotehost 'bash -s' <<< vim /tmp/x.txt

ssh将为远程系统分配一个tty,它不会打印该消息。

如果在远程系统上运行的命令不需要tty,则可以将-t选项保留在外:

1
ssh remotehost 'bash -s' <<< vim /tmp/x.txt

我相信以下内容可能适合您的目的:

1
vim /tmp/x.txt ; ssh remotehost 'bash -s' < /tmp/x.txt

第一个表达式(vim ...允许您将要远程执行的命令指定为名为/tmp/x.txt的本地文件;第二个表达式(ssh ...调用远程bash解释器,并将本地文件的内容发送给它执行。注意,在这种情况下,您不需要ssh-t选项(这会引起伪终端警告),也不需要使用here字符串(<<<但可以使用普通的文件输入操作符(<)。

此解决方案似乎适用于以下文件内容:

1
2
echo These commands are being executed on $HOSTNAME
echo This is a second command