568 字
3 分钟
一个手滑引发的 SSH 重定向探索

某天想 SSH 进服务器,手速太快,打出了这个:

Terminal window
ssh root@159.223.190.244 > login

然后终端……什么都没有。光标在那里,没有密码提示,没有报错,什么都没有。

懵了。


发生了什么#

> login 不是”登录”的意思。

在 shell 里,>输出重定向符号。这条命令的意思是:

执行 SSH,然后把所有输出写到当前目录下一个叫 login 的文件里。

所以终端没有任何显示——SSH 的输出全跑到 login 文件里去了。密码提示、登录信息、所有东西,全在那个文件里安静地躺着。

NOTE

这个 login 只是一个普通文件名,不是任何命令或系统文件。只是名字看起来很像”登录”,所以格外容易让人懵。


越挖越深#

既然 > 可以重定向输出,那 < 呢?

Terminal window
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 > fileSSH 输出全部写入文件,终端无显示
ssh user@host < script把脚本内容作为输入送给 SSH 执行
ssh user@host < script > file非交互执行脚本,输出写入文件

一个手滑,意外学到了 SSH 和 shell 重定向结合时的行为。

生活就是这样,踩坑也是一种学习。

一个手滑引发的 SSH 重定向探索
https://blog.lishuyu.top/posts/ssh-login-with-pip/
作者
猫猫魔女
发布于
2025-02-18
许可协议
CC BY-NC-SA 4.0