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'运行它?感谢。
答案 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}})但可以使用普通文件输入操作符(<<<
)。
此解决方案似乎适用于例如以下文件内容:
<