我有一个 awk 脚本,.bashrc
可以读取字符并修改一些关键字。当我通过它传输其他基本命令时,它工作得很好tail -f
,但是当我通过它传输 ssh 时,我遇到了问题。一切都按预期工作正常,除了在按回车键之前我看不到在终端上输入的任何内容:
~# ssh admin@localhost -p 5200 | my-script
admin@localhost's password:
admin connected from 127.0.0.1 using ssh on home
admin@ssh-server> exit ***<- I don't see this line (including the prompt) at all on terminal until I type my command (exit) and press Enter***
Connection to localhost closed.
我思考我明白为什么会这样,但不知道如何解决。我认为在返回 EOL 之前,不会通过管道发送 ssh 的交互式命令。我已经尝试了从 unbuffer/stdbuf 到 tee/script 搜索并使用各种重定向命令找到的所有内容,但都没有运气。
笔记:实际上,我可以在 EOL 后将字符串传递到我的脚本,我只需要能够看到我正在输入的内容,即需要终端标准输入像往常一样进行回显。
答案1
我能够执行以下操作:
$ ssh [email protected] | tee output
Last login: Tue Aug 15 03:06:11 2017 from 127.1.2.3
$ ls /
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
$ logout
Shared connection to example.com closed.
$ cat output
Last login: Tue Aug 15 03:06:11 2017 from 127.1.2.3
$ ls /
bin boot dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
$ logout
ssh
当我正常编辑到远程主机时,我会看到提示、我的输入以及其他所有内容。
答案2
如果您的交互式 shell 不需要终端即可工作,请考虑通过添加选项-T
来禁用 SSH 客户端中的 PTYSSH(1)命令。您将能够看到您的输入,因为在这种情况下回显是在您的本地终端中完成的。
请注意,OpenSSHSSH(1)如果启用 PTY,则将 stderr 重定向到 stdout,因此如果禁用 PTY,您的脚本可能会获取更少的数据。也可以看看https://stackoverflow.com/questions/16838624/why-does-openssh-requesttty-cause-stderr-redirected-to-stdout。