568 字
3 分钟
一个手滑引发的 SSH 重定向探索
某天想 SSH 进服务器,手速太快,打出了这个:
ssh root@159.223.190.244 > login然后终端……什么都没有。光标在那里,没有密码提示,没有报错,什么都没有。
懵了。
发生了什么
> login 不是”登录”的意思。
在 shell 里,> 是输出重定向符号。这条命令的意思是:
执行 SSH,然后把所有输出写到当前目录下一个叫
login的文件里。
所以终端没有任何显示——SSH 的输出全跑到 login 文件里去了。密码提示、登录信息、所有东西,全在那个文件里安静地躺着。
NOTE这个
login只是一个普通文件名,不是任何命令或系统文件。只是名字看起来很像”登录”,所以格外容易让人懵。
越挖越深
既然 > 可以重定向输出,那 < 呢?
ssh root@159.223.190.244 < new.bash > login这条命令做了两件事:
< new.bash:把new.bash的内容作为 SSH 的标准输入送进去> login:把 SSH 的输出写到login文件
结果是:SSH 连上去,把脚本内容当命令执行,执行完就退出,全程不需要人工交互。
挺奇诡的,但逻辑上完全说得通。
但是有个警告
实际测试时,终端打印了这么一行:
Pseudo-terminal will not be allocated because stdin is not a terminal.这是 SSH 在说:我检测到标准输入不是一个真实的终端(而是一个文件),所以我不会给你分配伪终端(pty)。
伪终端负责处理交互式的东西,比如颜色、光标控制、vim 这类工具。没有它,SSH 会话变成纯粹的命令执行模式,不交互,不花哨。
WARNING没有伪终端的情况下,
sudo等需要交互的命令可能会失败,因为它们需要一个真实的终端来接收密码输入。
小结
| 命令 | 实际行为 |
|---|---|
ssh user@host > file | SSH 输出全部写入文件,终端无显示 |
ssh user@host < script | 把脚本内容作为输入送给 SSH 执行 |
ssh user@host < script > file | 非交互执行脚本,输出写入文件 |
一个手滑,意外学到了 SSH 和 shell 重定向结合时的行为。
生活就是这样,踩坑也是一种学习。
一个手滑引发的 SSH 重定向探索
https://blog.lishuyu.top/posts/ssh-login-with-pip/