登录而不运行bash_profile或bashrc


75

因此,假设其中一个输入错误.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

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

Answers:


24

我认为您唯一的选择是:

  • 以其他用户身份登录并使用您的帐户;

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

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

  • 让管理员解决问题。


4
“假设您对计算机没有物理访问权限,并且这是唯一具有ssh登录能力的用户帐户。”
丹尼斯·威廉姆森

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

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

117

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


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

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

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

2
如果您的默认外壳是csh / tcsh,则即使非交互式外壳也将始终为您提供.cshrc/ .tcshrc
布赖恩·范登堡

我坐在这里,因为自己的愚蠢而笑到现在为止。您的解决方案效果很好。非常感谢您帮助这个修补匠完成了一些工作
ijustlovemath

36

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


11
我对此表示怀疑,但这确实有效……
rmobis '16

这是天才!
user1747134 '16

确实有效...谢谢!其他方法对我没有用。
Zzzach ... 17-10-30

在只有.bash_profile的Mac上,这对我
有用

天哪,我以为我已经搜索了整个互联网,所以我决定尝试一下,这是对我有用的唯一方法!谢谢!
蔡家好

21

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

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


11
这既很棒又失败。
MikeyB

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

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

15

您需要a)在不使用'ing 或'的情况下启动bash,以及b)由于这样的外壳不是完整的登录外壳/没有tty附加,请强制ssh附加ttysource~/.bashrc~/.bash_profile

ssh -t user@host bash --norc --noprofile

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

7

你真倒霉

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


3
对于sftp来说也是如此-甚至SSH子系统显然也可以在Shell中执行。
lxgr 2014年

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

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

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

6

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

另外,在大多数linux系统上,指定/ bin / sh不会执行任何操作,因为这只是bash的符号链接!

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

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相同。

现在,如果您注意到,MY系统未同时运行两个文件,则仅运行一个文件。但是原始发布者在.bash_profile中的一行运行.bashrc,因此.bashrc无论如何都将始终运行。不应该把那条线放在那里!如果该行不存在,那么您就不会有问题。

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


一些好处;没有执行过的命令可以帮助你解释,但有点有争议的问题:如果/bin/sh 没有获得先执行,这有所帮助,因为击加载~/.bashrc时的调用sh。该答案是另一个答案的超集,因此请删除另一个答案。
mklement

3

就像是:

ssh host "/bin/bash --norc"

这似乎可行,但是请注意,未设置PS1,因此您将在没有提示的情况下键入命令。

这具有非破坏性的优点。


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

2

尝试

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

^ C有control -v然后c


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

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

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

1

只要您可以在.bashrc退出之前获得ctrl-C,就可以进行ctrl-C混搭。不幸的是,如果exit在.bashrc的早期,这可能很难做到。

您可以通过将其直接管道输送到ssh来尽快放入ctrl-C:

{ echo ^C; cat /dev/tty; } | ssh -tt user@host

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

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


0

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


除非我(假设)记住错误的目录结构,并且没有给我一个错误,否则这是行不通的-scp还会运行文件。
汤姆·里特”

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

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


0

如果您的系统正常设置,则不会为非交互式外壳运行.bash_profile(例如运行命令)。

由于您指出问题出在.bash_profile文件中,请尝试将其移开:

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

我没想到这办法文件被链接要紧- .bash_profile中包含的.bashrc =(我增加了更多的信息。
汤姆·里特

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

0

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

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


0

对user60069表示感谢,它对我有用,但是我使用了特定于外壳的启动文件.bashrc,因此使用/ bin / sh登录对我有用。

但是,如果您处在“没有这种运气”的情况下,我将根据user60069和Dennis W的解决方案提供此解决方案:

ssh -t you@host  /bin/bash --noprofile  --norc

丹尼斯W提供了--norc选项,有人说这对他们不起作用。

运行“ man bash”或“ man(您的外壳)”以获得禁用启动文件的选项。您只需要在花费时间来解决问题时使用讨厌的shell。


0

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

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

希望这可以帮助!


-1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.