远程搞砸了我的 .bash_profile,无法通过 ssh 重新登录

ein*_*lum 70 linux ssh bash remote-access

我正在通过 SSH 远程使用 GNU/Linux 系统。

我错误地在我的$HOME/.bash_profilescriot 中添加了一些导致错误的东西。(具体来说:我添加了一个exec foo命令而不是. foo, 应用于另一个没有执行权限的 bash 脚本,这会导致错误。)

现在我似乎无法通过 SSH、SCP 或 SFTP 进入我的机器:bash,我的登录 shell,尝试运行exec foo命令,得到错误并将我扔出去!我没有可以远程访问的任何其他帐户。

我可以做些什么来恢复对系统的访问?

额外细节:

  • 由于计算机位于防火墙后面,因此除 SSH 之外的大多数端口都不可用。
  • 这是一个 Devuan 3 ASCII (~= Debian 10 Beowulf) 系统。

sty*_*fly 130

如此处所述您可以使用

ssh -t user@host bash --noprofile
Run Code Online (Sandbox Code Playgroud)

事实上,正如@JoL 建议的那样,您甚至不需要--noprofile,因为当 ssh 将 bash 作为另一个命令执行时,它不被视为登录 shell。运行ssh -t user@host bash只会读取RC文件;并且运行ssh -t user@host bash --norc甚至不会读取那些。

  • 你不需要`--noprofile`。`ssh -t user@host bash` 已经没有读取配置文件。原因是因为配置文件仅针对“交互式登录 shell”读取,并且通过执行 `ssh -t user@host bash` 你有一个登录非交互式 shell 调用非登录交互式 shell,因此两者都不会读取它。 (2认同)

ken*_*orb 48

尝试 SSH 并运行sh而不是bash,例如

ssh user@host sh
Run Code Online (Sandbox Code Playgroud)

然后重命名 ( mv) 或编辑损坏的文件 ( ex/vi)。

  • 考虑到除了运行编辑器来修复您登录的“.bash_profile”之外,您实际上不会做任何事情,我不知道有哪些 shell 功能可用。 (47认同)
  • @spuck `sh` 可能与 `bash` 是相同的二进制文件,但正是出于这个原因,当它作为“sh”调用时(包括不读取 Bash 特定的文件),它仍然会改变其行为。 (10认同)
  • 这可能有效,但您不能指望“sh”实际上是一个不同的外壳。例如,在这个 Ubuntu 机器上,/bin/sh 是 /bin/dash 的符号链接。 (7认同)

che*_*ner 20

运行ssh -t host vi .bash_profile(或您选择的编辑器代替vi)并修复您的.bash_profile.

-t可能不需要该选项,具体取决于您选择的编辑器。)

如果您确切地知道需要修复什么,您也许能够以非交互方式修复它。例如,像

printf 's/exec foo/. foo/\nwq\n' ssh host ed .bash_profile
Run Code Online (Sandbox Code Playgroud)