无需获取 .bashrc 的 SSH

j-h*_*hui 6 linux ssh terminal bash bashrc

.bashrc我在通过 SSH 远程登录到服务器时正在试验我的文件。我无意中留下了一个exit,导致所有后续登录立即断开连接。我实际上被锁在门外了。我能够在具有 root 权限的人的干预下恢复访问权限,但是如果没有其他人的帮助,这可能吗?

我尝试做诸如运行ssh <server> 'bash --norc --noprofile'和 之类的事情ssh <server> 'mv .bashrc bashrc-backup',甚至尝试用 强制覆盖它scp empty-file <server>:.bashrc。然而,所有这些选项似乎都依赖于.bashrc在运行命令之前首先找到损坏的源,因此它们都不起作用。

很可能这种情况是没有办法摆脱的。但这是设计使然吗?为什么很容易将自己锁定在系统之外,例如仅通过运行,是否有原因ssh <server> 'echo exit > .bashrc'?有没有办法减少这种错误?

Ken*_*ter 4

正如另一个答案中所讨论的,当 SSH 客户端连接到 OpenSSH 服务器时,OpenSSH 服务器通常会使用用户的登录 shell 代表客户端启动 shell 会话:

  1. 如果客户端请求交互式会话,服务器将启动用户的登录 shell。
  2. 如果客户端请求运行命令,服务器将使用用户的登录 shell 将命令作为 shell 命令运行。
  3. scprsync、 和git这样使用 ssh 进行传输的实用程序将请求在远程系统上运行命令,因此它们属于#2。

如果远程用户的 shell 启动文件中存在导致 shell 退出的内容,那么您将无法进入。

然而,SFTP 是一个特例。OpenSSH 服务器可以配置为支持 SFTP,而无需启动外部命令。如果是这种情况,那么您可以使用 sftp 连接到服务器并删除、重命名或更改.bashrc导致问题的文件。

这取决于服务器如何配置以支持 sftp。它可以通过启动外部程序(名为sftp-server)来为 sftp 会话提供服务。在这种情况下,您会遇到与使用scp. 或者,服务器可以通过称为“internal-sftp”的方式为 sftp 会话提供服务,这不需要调用 shell。这仅取决于特定 SSH 服务器的配置方式。