ssh -t remotehost vim /tmp/x.txt
Run Code Online (Sandbox Code Playgroud)
我知道我可以运行如上所述的命令.
但我希望能够在远程计算机上运行任何本地bash代码.出于这个原因,我想调用远程'bash -s',以便可以处理任何本地bash代码.
ssh -t remotehost 'bash -s' <<< vim /tmp/x.txt
Run Code Online (Sandbox Code Playgroud)
但是,上面的例子显示"由于stdin不是终端,因此不会分配伪终端".有没有办法让ssh通过stdin获取本地bash代码并通过远程'bash -s'运行它?谢谢.
ssh -t remotehost 'bash -s' <<< vim /tmp/x.txt
Run Code Online (Sandbox Code Playgroud)
您正在获取"伪终端将不会被分配..."消息,因为-t当ssh进程的标准输入不是TTY时,您正在使用单个选项运行ssh .在这种情况下,ssh专门打印该消息.-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
Run Code Online (Sandbox Code Playgroud)
ssh将为远程系统分配一个TTY,它不会打印该消息.
如果在远程系统上运行的命令不需要TTY,则可以退出该-t选项:
ssh remotehost 'bash -s' <<< vim /tmp/x.txt
Run Code Online (Sandbox Code Playgroud)
我相信以下内容可能适合您的目的:
vim /tmp/x.txt ; ssh remotehost 'bash -s' < /tmp/x.txt
Run Code Online (Sandbox Code Playgroud)
第一个表达式 ( vim ...) 允许您将要远程执行的命令指定为名为/tmp/x.txt;的本地文件。第二个表达式 ( ssh ...) 调用远程 bash 解释器,并将本地文件的内容发送给它执行。请注意,在这种情况下您不需要-t选项ssh(这会导致伪终端警告),并且您不需要使用此处字符串( <<<),但可以使用普通文件输入运算符 ( <)。
该解决方案似乎适用于例如以下文件内容:
echo These commands are being executed on $HOSTNAME
echo This is a second command
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24541 次 |
| 最近记录: |