我正在通过 SSH 远程使用 GNU/Linux 系统。
我错误地在我的$HOME/.bash_profile
scriot 中添加了一些导致错误的内容。(具体来说:我添加了一个exec foo
命令而不是. foo
,应用于另一个没有执行权限的 bash 脚本,这会导致错误。)
现在我似乎无法通过 SSH、SCP 或 SFTP 进入我的机器:bash,我的登录 shell,尝试运行exec foo
命令,得到错误并把我扔了出去!我没有任何其他可以远程访问的帐户。
我可以做些什么来恢复对系统的访问吗?
额外细节:
- 由于机器位于防火墙后面,除 SSH 以外的大多数端口都不可用。
- 这是一个 Devuan 3 ASCII (~= Debian 10 Beowulf) 系统。
如此处所述,您可以使用
实际上,正如@JoL 所建议的那样,您甚至不需要
--noprofile
,因为当 ssh 将 bash 作为另一个命令执行时,它不被视为登录 shell。运行ssh -t user@host bash
只会读取 RC 文件;并且运行ssh -t user@host bash --norc
甚至不会读取那些。尝试 SSH 并运行
sh
而不是bash
,例如然后重命名 (
mv
) 或编辑损坏的文件 (ex/vi
)。运行
ssh -t host vi .bash_profile
(或您选择的编辑器代替vi
)并修复您的.bash_profile
.(
-t
可能不需要该选项,具体取决于您选择的编辑器。)如果您确切知道需要修复的内容,则可以以非交互方式修复它。例如,像
如果只是
~/.bash_profile
搞砸了,请参阅其他答案以修复它。该答案的其余部分详细说明了修复所有(其他)登录脚本。如果你很不幸,你的and
echo Bad luck; exit 42
开头都有,并且你有作为你的登录 shell,并且也不起作用,那么你不太可能远程修复它。那是因为 sshd 会坚持运行你的登录 shell,第一个会读取or ,并且指定为时已晚,因为sshd 的运行没有这些标志,无论你在命令行中指定什么。~/.bashrc
~/.bash_profile
/bin/bash
ssh root@host
/bin/bash
~/.bashrc
~/.bash_profile
bash --norc --noprofile
/bin/bash
ssh
如果你只搞砸了
~/.bashrc
,那么运行这个来修复它:如果你只搞砸了
~/.bash_profile
和/或~/.profile
和/或~/.bash_login
,那么运行这个来修复它:修复后,您可以
ssh host
像往常一样,在您喜欢的编辑器中清理登录脚本文件,或使用 scp、sftp 或 rsync 传输文件并在本地编辑它们。