使用没有 tty 的 heredoc 在 ssh 后获取 bash 提示

Posted

技术标签:

【中文标题】使用没有 tty 的 heredoc 在 ssh 后获取 bash 提示【英文标题】:Get bash prompt after ssh with heredoc with no tty 【发布时间】:2021-09-28 18:10:21 【问题描述】:

我想通过 ssh 连接到远程机器,使用 heredoc 自动执行一些代码,然后为用户提供 bash 提示,以便根据需要手动执行进一步的命令。

到目前为止我尝试过(选项 1)

ssh user@host << 'EOF'
echo "Hello"
EOF

这会很好地打印出“Hello”,但会关闭 ssh 连接并退出脚本。我也得到了臭名昭著的“伪终端将不会被分配,因为标准输入不是终端。”

使用单个 -t 开关的结果相同。

接下来我尝试了(选项 2)

ssh -tt user@host << 'EOF'
echo "Hello `uname -n`"
EOF

哪个工作,但会产生一组奇怪的输出:

Success. Logging you in...
echo "Hello"
echo "Hello"
[remote]$ echo "Hello"
Hello
[remote]$ <

尝试不使用heredoc,比如

ssh user@host 'echo "Hello"; /bin/bash' 

但 echo 将在不同的 shell 上执行

到目前为止,选项 2 让我最接近。欢迎任何其他解决方案!

【问题讨论】:

也许像ssh -t user@host &lt;&lt;&lt; "commands; exec bash" 这样的东西会起作用。目前无法尝试。 见Run Remote ssh command with Full Login Shell。 【参考方案1】:

您可以尝试在命令行上设置一些 ssh 选项。这些也可以在用户的​​ ~/.ssh/config 文件中设置。将 remote-host 替换为 user@host 或等效的 ssh config Host 模式。

单行

ssh -o RequestTTY='yes' -o RemoteCommand='echo "Hello $(uname -n)"; bash -l' remote-host

多行

ssh -o RequestTTY='yes' -o RemoteCommand='
echo "hello from $(uname -n)"
echo "I am $(whoami)"
bash -l
' remote-host

【讨论】:

以上是关于使用没有 tty 的 heredoc 在 ssh 后获取 bash 提示的主要内容,如果未能解决你的问题,请参考以下文章

SSH 在 Windows 10 中不接受密码:read_passphrase:无法打开 /dev/tty:没有这样的文件或目录

SSH heredoc:bash 提示符

从 ~/.ssh/config 调用的脚本丢失 TTY

如果分配了伪 tty,为啥通过 ssh 运行后台任务会失败?

ssh登录自动输入密码

如何在不覆盖 TTY 的情况下将密码传递给 su/sudo/ssh?