【问题标题】:How to deal with "Pseudo-terminal will not be allocated because stdin is not a terminal."如何处理“伪终端不会被分配,因为stdin不是终端”。
【发布时间】:2018-07-16 20:15:25
【问题描述】:
ssh -t remotehost vim /tmp/x.txt

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

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

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

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

【问题讨论】:

    标签: ssh tty


    【解决方案1】:
    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相关:

    请求TTY
    指定是否为会话请求伪 tty。参数可能是以下之一:no(从不请求 TTY)、yes(在标准输入为 TTY 时始终请求 TTY)、force(始终请求 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
    

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 我忘了提到在这种情况下您可以从ssh 命令中删除-t 选项,这应该可以消除伪终端警告。我编辑了上面的答案;当前命令现在似乎在我的系统上正常工作(它远程执行本地文件而不显示警告)。
      • 如果此答案不能解决您的问题,请考虑阐明您要远程执行的实际命令。
      猜你喜欢
      • 2011-10-30
      • 1970-01-01
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 2019-08-13
      • 2017-10-31
      • 2011-06-07
      相关资源
      最近更新 更多