我$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/
瞧!我能够再次登录我的服务器。