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

时间:2018-02-06 17:21:10

标签: ssh tty

ssh -t remotehost vim /tmp/x.txt

我知道我可以运行如上所述的命令。

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

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

但是,上面的例子显示“由于stdin不是终端,因此不会分配伪终端”。有没有办法让ssh通过stdin获取本地bash代码并通过远程'bash -s'运行它?感谢。

2 个答案:

答案 0 :(得分:7)

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

当你对ssh进程的标准输入不是TTY时,你正在运行带有单个-t选项的ssh的“伪终端将不会被分配...”消息。在这种情况下,ssh专门打印该消息。 documentation for -t说:

  

<强> -t
  强制伪终端分配。这可用于在远程机器上执行任意基于屏幕的程序,这可能非常有用,例如,实现菜单服务时。 多个-t选项强制tty分配,即使ssh没有本地tty。

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

  

<强> RequestTTY
  指定是否为会话请求伪tty。参数可以是以下之一:no(从不请求TTY),yes(当标准输入是TTY时始终请求TTY),强制(始终请求TTY)或auto(在打开登录会话时请求TTY)。此选项镜像ssh(1)的-t和-T标志。

单个-t相当于“RequestTTY yes”,而其中两个相当于“RequestTTY 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

答案 1 :(得分:0)

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

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

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

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

<