在不运行 bash_profile 或 bashrc 的情况下登录

Tom*_*ter 92 ssh login bashrc

因此,假设有人在其中输入了一些内容以.bashrc阻止他(或她)通过 viassh登录(即 ssh 登录因文件中的错误而退出)。有没有什么方法可以让这个人在不执行它的情况下登录(或者.bashrc因为一个运行另一个),或者以其他方式删除/重命名/使文件无效?

假设您没有对机器的物理访问权限,并且这是唯一可以通过 ssh 进入的用户帐户。

供参考:.bash_profile包括.bashrc

[[ -f ~/.bashrc ]] && . ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

编辑:我尝试过的事情:

ssh user@host "rm ~/.bashrc"

scp nothing user@host:/RAID/home/tom/.bashrc

ssh user@host  "/bin/bash --norc"
Run Code Online (Sandbox Code Playgroud)

都给出错误:

/RAID/home/tom/.bashrc: line 16: /usr/local/bin/file: No such file or directory
/RAID/home/tom/.bashrc: line 16: exec: /usr/local/bin/file: cannot execute: No such file or directory
Run Code Online (Sandbox Code Playgroud)

小智 150

ssh -t username@hostname /bin/sh 为我工作。

  • 这对我不起作用(尽管它应该根据手册页)。本地主机运行 ubuntu 14.04.1,而远程主机上运行的是 ubuntu 12.04.5。我无法 rsync 因为我的登录 shell 是 tcsh 并且在远程主机上它打印垃圾(tcsh:没有这样的文件或目录 tcsh:试图从“/u/levy”开始——有人告诉我这是因为目录已安装 NSF)。我以为我会绕过登录外壳来解决问题,但这不起作用。 (2认同)
  • 如果您的默认 shell 是 csh/tcsh,即使对于非交互式 shell,它也会*始终* 获取您的 `.cshrc`/`.tcshrc`。 (2认同)
  • 我坐在这里为自己的愚蠢而笑得前仰后合。你的解决方案效果很好。非常感谢您帮助这位修补匠完成一些工作 (2认同)
  • @Tom Ritter - 这需要成为公认的答案。 (2认同)

小智 52

我遇到了同样的问题,并以某种方式能够解决它。我使用ssh访问系统,并在我登录系统后立即按住Ctrl + c。然后, ~/.bashrc 没有被读取,我可以修改它。

  • 我很怀疑,但这确实有效...... (15认同)
  • 这真是天才! (3认同)
  • 是的!这是唯一对我有用的 (2认同)

lar*_*sks 29

我认为你唯一的选择是:

  • 以另一个用户身份 ssh 进入,然后 su 到您的帐户;

  • 如果主机上启用了相关服务,则使用诸如 ftp 或 smbclient 之类的东西;

  • 在开放的网络服务中找到一个开放的漏洞并利用它:)。

  • 让管理员来解决问题。

  • “假设您没有对机器的物理访问权限,而这是唯一能够通过 ssh 进入的用户帐户。” (6认同)
  • 使用 Filezilla 将 SFTP 连接到我的服务器,它修复了我。非常感谢,你救了我。我的 .bash_profile 中出现了“exit 1”条件,这让我很不舒服。 (4认同)

Uri*_*Dev 25

您需要 a)不使用'ing或b ) 启动bash,因为这样的 shell 不会是完整的登录 shell / 没有附加tty,强制ssh附加ttysource~/.bashrc~/.bash_profile

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

  • 这有效,但请注意,您不会看到通常的提示,只有一个空屏幕。尝试做一个 `ls` 来说服自己你在 :)。另请注意,这将使用“愚蠢”术语,因此对我而言 nano 不起作用 (4认同)

Tom*_*ter 22

我使用已发布的 CVE 通过我安装的网络监控软件中的 Web 界面以 root 身份执行命令。 rm /RAID/home/tom/.bashrc

然后我可以登录并 svn 恢复我所做的更改。

  • 这既很棒又很失败。 (12认同)
  • 它是一个 oooold 版本的 cacti,所以除非你运行 8 年前的软件,否则我认为它不会帮助你。如果您运行的是 8 年前的软件,我帮不了你。;) (2认同)

Tob*_*obu 7

你倒霉了。

所有 ssh 命令都运行您的登录 shell。ssh $COMMAND运行$SHELL -c $COMMANDscp运行$SHELL -c /path/to/sftp-server,普通ssh只是运行你的外壳。

  • 对于 sftp 也是如此——即使 SSH 子系统显然也是从 shell 中执行的。 (3认同)

Eva*_*ois 6

以上答案都不能绕过ssh的登录shell。您可以传递一个完整的命令行,因此它运行远程 shell 来处理命令并为命令设置工作环境。这就是 shell 的用途,也是 Unix 的方式。如果您尝试在没有外壳的情况下运行某些程序,则会遇到各种兼容性问题。同样,尝试使用 control-C 应该与调用 exit 相同,这是您试图避免的行为。如果 bash 继续它的一个错误。为什么人们一直说手册页说了一些不同的东西需要引用它,因为它在我的手册页中什么也没说。

此外,在大多数 linux 系统上,指定 /bin/sh 没有任何作用,因为这只是 bash 的符号链接!

要测试吗?将“echo”语句添加到您的 .bashrc 和 .profile 中,然后查看运行的是哪个。我做到了。这是结果。

ssh user@host将执行 .bash_profile ssh user@host /bin/bash将执行 .bashrc,但它认为它是非交互式的(没有提示)。 ssh -t user@host /bin/bash执行 .bashrc 两次......一次在登录时,一次用于传递的命令,因此指定 ANY shell 将始终运行第一个。 ssh -T user@host与根本不指定 -T 或 -t 相同。

现在,如果您注意到,我的系统不会同时运行这两个文件,而是只运行其中一个。但是原始海报在 .bash_profile 中有一行运行 .bashrc,因此 .bashrc 无论如何都会运行。不应该把那条线放在那里!如果那条线不存在,你就不会有问题。

您需要找到另一种方式或找到管理员。这就是管理员的用途。