假设某人在他们的.bashrc中输入了错误内容,使他(或她)无法通过ssh登录(即ssh登录由于文件错误而退出)。如果有人不执行该文件(或者因为一个人在运行另一个人,请登录.bashrc),或者以其他方式删除/重命名/使该文件无效,是否可以登录?

假设您没有物理访问权限,计算机,这是唯一具有ssh功能的用户帐户。供参考:.bash_profile包括.bashrc

[[ -f ~/.bashrc ]] && . ~/.bashrc


编辑:我尝试过的事情:

ssh user@host "rm ~/.bashrc"

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

ssh user@host  "/bin/bash --norc"


全部给出错误:

/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


评论

您的scp命令将不起作用,因为连接时scp还将读取.bashrc。为避免该问题,将来,您可以在./bashrc的开头添加[-z“ $ PS1”] &&之类的内容。这样,scp将在第一行之后停止解析.bashrc,并且在紧急情况下您可以将其覆盖。

#1 楼

我认为您唯一的选择是:


以其他用户身份登录并以su身份登录您的帐户;
如果主机上启用了相关服务,则使用ftp或smbclient之类的东西;
在开放式网络服务中发现一个开放漏洞并加以利用:)。
请管理员修复此问题。


评论


“假设您对计算机没有物理访问权限,并且这是唯一具有ssh功能的用户帐户。”

–丹尼斯·威廉姆森
09年12月15日在16:05

我要走这条路。找到解决方案后,我将发布解决方案。幸运的是,我有几种攻击途径。

–汤姆·里特(Tom Ritter)
09年12月15日在21:07

使用Filezilla将SFTP传输到我的服务器中,并修复了我。非常感谢,您救了我。我的.bash_profile中偶然有一个“退出1”状态,它使我感到沮丧。

– djangofan
2012年10月19日23:46



#2 楼

ssh -t username@hostname /bin/sh对我有用。

评论


效果很好-简单,并提供了一个可用于解决问题的外壳。

– MT。
2011年10月2日,16:55

尝试使用Google Chrome浏览器中的Secure Shell应用程序(chrome.google.com/webstore/detail/secure-shell/…)进行此操作,但无法弄清楚如何/在哪里放置命令行参数。有小费吗?

– Benj
14年2月19日在14:19

这对我不起作用(尽管应该根据手册页进行操作)。本地主机在远程主机上运行ubuntu 14.04.1,而在本地运行ubuntu 12.04.5。我无法进行rsync,因为我的登录shell是tcsh,并且在远程主机上它会打印垃圾(tcsh:没有这样的文件或目录tcsh:尝试从“ / u / levy”开始-我被告知这是因为目录已安装NSF)。我以为我可以绕过登录外壳来解决问题,但这不起作用。

–西尔维奥·利维(Silvio Levy)
2015年3月28日3:00



如果您的默认外壳是csh / tcsh,即使对于非交互式外壳,它也始终会提供.cshrc / .tcshrc。

–布莱恩·范登堡(Brian Vandenberg)
15年7月17日在21:37

@Tom Ritter-这需要被接受。

–戴夫·多普森
20年6月11日在20:45

#3 楼

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

评论


我对此表示怀疑,但这确实有效。

– rmobis
16年5月19日在19:42

这是天才!

–user1747134
16年11月11日在11:14

确实有效...谢谢!其他方法对我没用。

– Zzzach ...
17-10-30在0:25

在只有.bash_profile的mac上,这对我有用:)

–AnneTheAgile
18年1月13日在14:51

是!这是唯一对我有用的

– DavidC
19年8月19日在10:05

#4 楼

您需要a)不使用source~/.bashrc启动bash,并且b)由于这样的外壳不是完整的登录外壳/没有tty附加,请强制ssh附加tty: >
ssh -t user@host bash --norc --noprofile


评论


此方法有效,但请注意,您将没有通常的提示,只是一个空白屏幕。尝试做ls说服自己自己在:)。还要注意,这将使用一个愚蠢的术语,所以对我而言,nano不起作用

–西门人Tomoiagă
'18 Sep 4'在8:22

@CiprianTomoiagă很好,这是一个主意,因为问题的前提是.bashrc已被破坏:)这应该使您足够了解清理损坏的情况,然后可以尝试再次将ssh放入普通shell。

–dimo414
20 Mar 18 '20在7:58

确实 !起初我有点困惑,因为甚至没有$符号来指示提示:)。

–西门人Tomoiagă
20 Mar 18 '20 at 11:16

#5 楼

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

然后我可以登录并svn还原我所做的更改。

评论


这既很棒又失败。

– MikeyB
2011-2-18在22:18

@TomRitter:请提供该ᴄᴠᴇ参考。

–user2284570
15年10月16日在13:24

它是仙人掌的老版本,因此,除非您运行的是8年以前的软件,否则我认为它不会对您有所帮助。如果您正在运行8年的软件,我将无济于事。 ;)

–汤姆·里特(Tom Ritter)
15年10月16日在20:32

出人意料地为我工作。谢谢。

–丹尼尔·达库纳(Daniel Da Cunha)
20 Mar 5 '20 at 23:38

#6 楼

您不走运。

所有ssh命令都可以运行您的登录Shell。 ssh $COMMAND运行$SHELL -c $COMMANDscp运行$SHELL -c /path/to/sftp-server,普通ssh仅运行您的shell。

评论


对于sftp来说也是如此-甚至SSH子系统也显然是在Shell中执行的。

–lxgr
2014年6月9日在23:17

以我的经验,即使ssh手册页显示“如果指定了命令,它是在远程主机而不是登录shell上执行的”,您是正确的。然而,发布者使用最高评分的答案(ssh主机名/ bin / sh)能够解决问题。是什么赋予了?

–西尔维奥·利维(Silvio Levy)
15年3月26日在21:15

@ Silvio,OP的回答是,他使用了与SSH不相关的漏洞。

–东武
15年3月27日在23:48

对。有人用最高的答案报告了成功,我急忙以为是OP。我希望它确实起作用了-我也有类似的情况,尽管这只是令人讨厌而不残废。 (请参阅我在上面评分最高的答案下的评论。)

–西尔维奥·利维(Silvio Levy)
2015年3月28日,下午3:02

#7 楼

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

要测试吗?在您的.bashrc和.profile中添加“ echo”语句,然后查看哪个正在运行。是的结果如下。 。一次登录时,一次用于传递的命令,因此指定ANY shell将始终首先运行。
ssh user@host与根本不指定-T或-t相同。如果您注意到,MY系统未同时运行两个文件,则仅运行一个文件。但是原始发布者在.bash_profile中的一行运行.bashrc,因此.bashrc无论如何都将始终运行。不应该把那条线放在那里!如果该行不存在,那么您就不会有问题。

您需要找到其他方式或找到管理员。这就是管理员的目的。

评论


一些好处;正如您所解释的那样,没有将作为命令传递的可执行文件提供帮助,但是有一点争议:如果/ bin / sh确实先执行,那么它将有所帮助,因为Bash在以sh调用时不会加载〜/ .bashrc。该答案是另一个答案的超集,因此请删除另一个答案。

–mklement
17年3月29日在21:23

#8 楼

像这样的东西:

ssh host "/bin/bash --norc"


似乎有效,但是请注意,未设置PS1,因此您将在没有提示的情况下键入命令。 >这具有非破坏性的优势。

评论


这不起作用,它先尝试成功登录,但无法登录,因此无法运行bash --norc

–汤姆·里特(Tom Ritter)
09年12月15日在12:27

#9 楼

尝试

echo ^C | ssh <hostname> ' rm .bashrc'


^ C有control-v然后c

评论


在我的系统上是ctrl-v和ctrl-c。不管怎么说,还是要谢谢你! :)

–mzuther
16年2月14日在13:24

#10 楼

ssh -t user@host "bash --norc --noprofile -c '/bin/rm .bashrc'"


评论


这对我来说是非常有限的环境,什么也没做。我必须指定.bashrc的完整路径。

–zbeekman
18年5月23日在15:28

#11 楼

只要您可以在.bashrc退出之前获得ctrl-C,就可以进行Ctrl-C混搭。不幸的是,如果exit早于.bashrc,这可能很难做到。 />
 { echo ^C; cat /dev/tty; } | ssh -tt user@host
 


请注意,^C的键入类似于ctrl-V,后跟ctrl-C。

这通过管道传送单个ctrl-C,然后从控制端子输入,而-tt强制分配伪端子。总而言之,这会在远程计算机上为您提供一个(有些格式错误的)shell,同时尽可能多地绕过.bashrc。

#12 楼

您可以尝试使用.bash_profile命令用空文件覆盖scp。通过我的Google搜索,scp使用了不会读取.bash_profile的非交互式登录。

评论


除非(假设)记住错误的目录结构,并且没有给我任何错误,否则这将不起作用-scp还会运行文件。

–汤姆·里特(Tom Ritter)
09年12月15日在12:30

人们没有意识到的是scp并不是什么特别的东西。这只是在ssh上运行的另一个命令-这意味着交互式ssh会话所发生的一切也与scp一起发生。

–幼虫
09年12月15日在14:24

关于sftp,afaik是一个ssh子系统。

– allo
17 Mar 16 '17 at 23:42

#13 楼

您也可以只删除bashrc文件:

ssh <hostname> rm ~/.bashrc


评论


问题出在.bash_profile文件中,而不是在bashrc中。

– Laurent Etiemble
09年12月15日在12:31

这是行不通的-它首先尝试使用shell并失败。

–汤姆·里特(Tom Ritter)
09年12月15日在12:32

#14 楼

如果您的系统正常设置,则不会在非交互式外壳程序(例如运行命令)上运行.bash_profile。它不会干扰:

ssh user@host "mv ~/.bash_profile ~/.bash_profile_broken"


评论


我不认为链接文件的方式很重要-.bash_profile包括.bashrc =(我添加了更多信息。

–汤姆·里特(Tom Ritter)
09年12月15日在12:37

但是Lockie的建议(已由bash手册页确认)是非交互式shell将不会运行.bashrc或.bash_profile。但是,即使当您在ssh命令行上传递命令时(如本例所示),bash仍将作为“交互式” shell启动,这意味着它将读取您的.bashrc文件。因此,一个好主意,但不幸的是ssh无法配合。

–幼虫
09年12月15日在14:32

#15 楼


UH ='user @ host'; ssh $ UH'mv〜/ .bashrc〜/ letmein'; ssh $ UH


请勿剪切并运行,更改userhost,然后编辑letmein并另存为.bashrc

#16 楼

对user60069表示感谢,它对我有用,但是我使用了特定于外壳的启动文件.bashrc,所以使用/ bin / sh登录对我有用。这样的情况”,我根据user60069和Dennis W的解决方案提供了此解决方案:

为他们提供帮助。

运行“ man bash”或“ man(您的外壳)”以选择禁用启动文件的选项。您只需要花费可憎的shell来解决问题。

#17 楼

其他登录服务器的方法是没有配置文件,请在下面找到命令ssh -t user@host bash --noprofile

对于使用pem文件且没有其他用户的AWS ssh -ti "YOUR-PEM-FILE-NAME.pem" ec2-user@YOUR-IP-ADDRESS bash --noprofile

希望有帮助!

#18 楼

这对我有用
$ ssh <hostname> bash --rcfile /dev/null


#19 楼

从上面给出的建议和响应中,我会说它不是.bashrc或.bash_profile文件。 ssh联机帮助页还说,如果您指定要执行的命令,则不会读取您的配置文件。

我建议尝试从绝对路径执行不同的登录shell(ksh?csh?sh?)。另外,请注意,这可能是一个完全不同的问题(quota?执行和读取主目录上的权限吗?),所以使用侧面方法会更好。您可以要求另一个用户执行ls -la $YOUR_HOME_DIR并将结果邮寄给您吗?