将“exit 0”添加到“.bashrc”并且无法登录服务器

将“exit 0”添加到“.bashrc”并且无法登录服务器

$HOME/.bashrc在我的托管服务器 CentOS 7 上进行了试验,并决定检查它在没有自定义用户设置的情况下的行为方式。

exit 0之前补充过source /etc/bashrc

从我的简短观察来看,它似乎只涉及提示和颜色。然而,它似乎还管理用户访问控制。

现在,当我尝试登录时,它会把我踢出去。

为什么会发生这种情况?

可以远程修复吗?

我一般都是用SSH登录。我可以设置一些属性或变量来解决这个问题吗?

答案1

如果 bash 行为正确,则.bashrc仅当 shell 是交互式 shell 时才应调用。因此,以下操作应该有效:

ssh server rm .bashrc

或者

ssh server mv .bashrc .bashrc-off

因为这会在服务器上创建一个非交互式 shell,该 shell 不受 .bashrc 中问题的影响。

不幸的是,许多 Linux 发行版都提供了一个.profile调用.bashrc,在这种情况下,您会迷失方向。

答案2

~/.bashrc每当 Bash 确定它正在由 sshd 运行时,无论它是否以交互方式运行,它也会直接获取源代码(1)

bash 确定的方式是通过检查是否A)envvarSHLVL小于 1 并且b)SSH_CLIENT或envvarsSSH2_CLIENT已设置或 stdin 是已连接套接字

例子:

$ echo echo this sux > /tmp/.bashrc
$ HOME=/tmp bash -c true
$ HOME=/tmp SHLVL= SSH_CLIENT= bash -c true
this sux

当从 ksh93 调用 bash 时,stdin 也可以是一个套接字,它使用 unix 域套接字对来实现管道:

$ ksh93 -c ': | HOME=/tmp SHLVL= bash -c :'
this sux

我想不出任何办法旁路~/.bashrc通过 ssh 运行时(除了利用 ssh 错误配置,例如用户能够设置额外的环境变量)。

无论如何,据我所知,许多系统管理员似乎都依赖于用户无法绕过它,无论是否有保证。

(1)这种行为是记录在案:

Bash 尝试确定它何时使用连接到网络连接的标准输入运行,例如何时由远程 shell 守护程序(通常是 rshd)或安全 shell 守护程序 sshd 执行。如果 bash 确定它正在以这种方式运行,它会读取并执行来自 的命令~/.bashrc(如果该文件存在并且可读)

在 Debian 上,它也将/etc/bash.bashrc在之前获取~/.bashrc(未记录)。

答案3

从评论中总结。

为什么exit.bashrc导致退出 SSH?

Paul_Pedant 的评论

您的个人资料源自登录 shell,未执行。因此exit退出登录 shell 本身。

可以远程修复吗?

罗艾玛的评论

您可能会通过 进行访问sftp user@host,具体取决于主机上的配置方式(内部或通过命令)。

roaima 避免此类情况的最佳建议

让该 shell 以 root 身份登录。然后尝试使用不同的会话再次登录。当您编辑系统文件时,始终

...

我发布此评论是为了结束问题。如果@Paul_Pedant 或@roaima 发布他们的答案,我会接受。

答案4

我刚刚做了同样的事情。我exit 0在服务器的 末尾添加了.zshrc,这相当于 Zsh 的 Bash .bashrc。就像你一样,我也无法登录我的服务器。

我通过使用scp命令(安全复制) a解决了该问题,而.zshrc无需exit 0覆盖现有命令,例如:

scp ~/.zsh/.zshrc my-server/.zsh/

瞧!我能够再次登录我的服务器。

相关内容