交互式 ssh 会话从 bash 命令开始

Interactive ssh session started from bash command

我正在尝试启动从 bash 命令创建的交互式 ssh 会话(如下所示)。

如果我不添加 'ttt',我只会收到 'non interactive' 会话消息并且 ssh 会话关闭。

添加 'ttt' 标志后,会话保持打开状态,但我无法输入命令或与远程会话交互。

这是我要执行的命令的简化版本

 echo "username@host" | xargs -I{} bash -x -c 'ssh -ttt" [=11=]' {}

不确定是否应该添加额外的标志或执行此操作的替代方法。

xargs(因此 bash,因此 ssh)的输入来自管道,而不是您的终端。根据更大的上下文,这些选项之一应该可以让 ssh 从终端读取:

  • 首先将主机列表捕获到一个数组,然后使用 for 循环而不是 xargs。像这样:

     readarray -t hostarray < <(echo "username@host")
     for host in "${hostarray[@]}"; do
         ssh "$host"
     done
    
  • -o选项添加到xargs,告诉它从/dev/tty(即终端)重定向命令的标准输入。

  • 通过不同的文件描述符重定向 xargs 命令周围的常规标准输入,例如#3(注意:我还没有测试过):

     { echo "username@host" | xargs -I{} bash -x -c 'ssh -ttt "[=11=]" <&3' {}; } 3<&0
    

顺便说一句,除了 ssh 没有得到它应该得到的输入(即从终端)的问题之外,您还可能会遇到它窃取用于其他用途的输入的问题,例如您希望 xargs 阅读的主机列表。参见 BashFAQ #89: I'm reading a file line by line and running ssh or ffmpeg, only the first line gets processed!