我不小心在bash命令行中输入了密码


189

我不小心输入了密码,进入bash命令行,误将Last login: ...线路Wrong password(我很着急)。我该怎么做才能掩盖我的踪迹?

我所做的是编辑.bash_history和删除有问题的行(必须重新登录一次才能看到密码出现在文件中,以便我可以删除它,然后再次登录以查看它从UPARROW键下可用的历史记录中消失了)。

还有其他可以保存命令历史记录的地方吗?系统是CentOS 6.5。


59
只需更改密码即可:)
gronostaj 2014年

96
更改密码并不是那么简单...我需要让管理员在15台不同的服务器上重新安装我的新公钥-这个家伙就像/dev/null
MaDa 2014年

71
如果您无法随时轻松更改密码,则可能存在严重的安全漏洞。当有人实际获得您的密码时,您将怎么办?您是否有办法立即撤销系统访问权限?
gronostaj 2014年

42
您可以更改ssh密钥的密码而不更改密钥:ssh-keygen -f id_rsa -p
jwg 2014年

6
只是提到,至少在联网的Windows登录名下,您很忙。管理员(在某些较高的服务器塔中)的默认设置是记录所有登录尝试,当然,用户名是明文。进取心的人所要做的就是搜索非用户名的字符串,并将它们与下一个有效的用户名(或同一台计算机上的下一次登录尝试)相关联。而且没有简单的方法可以删除该管理日志文件。因此,您真的必须更改您的密码。
卡尔·威索夫特

Answers:


184

您只能从bash的历史记录中删除有问题的行,而不是清除整个历史记录。只需删除带有-d标志的行,然后保存(写入)带有-w标志的新历史记录:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352
$ history -w

1
请注意,如果您设置了“ PROMPT_COMMAND = history -a”,则此操作将无效。通过此操作,当命令终止后显示提示时,带有密码的命令将立即写入.bash_history。您必须编辑.bash_history才能将其删除。
benrifkah

1
还要注意,如果将该行写入了宿主文件中,并且随后打开了多个外壳程序(终端窗口),那么所有这些外壳程序都将在该历史记录中包含它!您将需要从所有这些shell中删除它,或者至少从您关闭的历史LAST shell中删除它!最好在使用它的外壳存在之前获取它。处理多个炮弹的历史可能成为噩梦。
安东尼

121

这有两个部分:

  • bash将历史记录存储在~/.bash_history默认情况下在会话结束时写入的文件中
  • history被保存在内存中

为了安全起见,您需要从会话中清除它:

history -c

并根据需要截断历史记录文件:

> ~/.bash_history

如果您输入密码的会话仍处于打开状态,则覆盖跟踪的另一种方法是将HISTFILE变量设置为null设备,以便~/.bash_history在会话退出时不会写入历史记录:

export HISTFILE=/dev/null

205
嘿,看,是管理员!
Raystafarian 2014年

5
双关语不是想要的,对不起:)我写评论时没有看你的昵称。
MaDa 2014年

7
偏执(但由于某种原因仍然无法更改密码),您是否不应该shred将该文件或以其他方式覆盖多次?
kojiro 2014年

1
@MaDa没问题。我什至在答案中添加了另一种方式,以将我的昵称带入图片。
devnull 2014年

5
设置HISTFILE=就足够了。From bash(1)如果未设置,则退出shell时不会保存命令历史记录。
Lekensteyn

23

由于bash(至少我知道的所有历史版本和当前版本)在退出之前不会自动保存历史记录,因此在键入要确保从不保存的命令时,通常适用的策略是立即键入:

kill -9 $$

这会杀死SIGKILL无法捕获的shell,因此shell无法在退出时保存任何内容。

大多数其他方法涉及事后清理(即在数据已经击中磁盘之后),这有很大的出错机会(丢失副本),尤其是在系统可能使用btrfs或类似文件的情况下。


2
+1,不只是更多的错误的机会,它可能甚至取决于是否/如何许多命令之后被执行收回
排排坐

缺少“自动”一词?因为dotancohen显示了一种无需退出shell即可保存历史记录的方法。
Ben Voigt 2014年

3
可以将Shell配置为在执行每个命令后保存历史记录,而不是在退出时保存历史记录。
尼克·马特奥

1
+1这正是我要推荐的!除了rm ~/.bash_history~在已经保存OP的情况下删除备份文件,
Tomas

请注意,如果您设置了“ PROMPT_COMMAND = history -a”,则此操作将无效。通过此操作,当命令终止后显示提示时,带有密码的命令将立即写入.bash_history。您必须编辑.bash_history才能将其删除。
benrifkah

11

意外键入不需要存储在历史记录中的内容后,可以键入: unset HISTFILE

当您注销时,Bash将不知道历史记录的存储位置,因此有效地这将禁用整个会话的历史记录。


请注意,如果您设置了“ PROMPT_COMMAND = history -a”,则此操作将无效。通过此操作,当命令终止后显示提示时,带有密码的命令将立即写入.bash_history。您必须编辑.bash_history才能将其删除。
benrifkah

11

我最喜欢的技巧是按下向上箭头,在命令上退格,键入一些内容(可能没有必要),按下向下箭头,键入“ ls”,然后按下Enter。感觉真的很曲折,但实际上有效。当我在历史记录中编辑了错误的命令后感到恼火,然后通过不按ctrl-c放弃编辑而破坏了它时,发现了这一点。我猜bash支持修订主义者的历史。;-)

$ passw0rd
$ <up arrow><backspace x8>cd<down arrow>echo hi
$ history|tail -3

看起来像:

$ passw0rd
passw0rd: command not found
$ echo hi
hi
$ history|tail -3
 2445* cd
 2446  echo hi
 2447  history|tail -3
$ 

这是奇怪的。一个缺点是,它似乎知道您已编辑历史记录,因此可能有某种方法可以还原旧版本?
MadTux

@MadTux-完全可以,但是.bash_history只是纯文本文件。因此,您可以执行上面的示例,退出并重新连接。当您查看.bash_history文件的完整内容时,没有什么可以区别于仅运行“ cd”文件的地方,因此该记录很干净。
Mark Jerde

请注意,如果您设置了“ PROMPT_COMMAND = history -a”,则此操作将无效。通过此操作,当命令终止后显示提示时,带有密码的命令将立即写入.bash_history。您必须编辑.bash_history才能将其删除。
benrifkah

10

除了其他答案外,现在还可以在终端滚动缓冲区中找到密码(显示的文本的历史记录),如果终端仿真器确实保存了密码,则可能还有其他问题,可能是在硬盘上。历史记录到磁盘。这种情况发生在KDE konsole中,其历史记录大小设置为“无限回滚”,从不丢弃任何输出。


6

使用时$<space> command,命令不会添加到历史记录中,有时很有用

$  history | grep mywierdgrep
$ history | grep mywierdgrep
 2005  history | grep mywierdgrep

2
尽管很有趣,但尚不清楚在所描述的场景中这是否有用。您是否建议每个密码都应以空格开头?
Ben Voigt 2014年

1
不,他的建议是将其放置在适当的位置,您键入的任何不希望提交给历史的行都应在前导空格处键入。例如:“ ls”变为“ ls”,并且该行从不显示在历史记录或会话的上箭头列表中。
Bryan C.

4
请注意,只有$ HISTCONTROL包含ignorespace时,此前导空格技巧才起作用。
Bernd Jendrissek'4

2
@ jris198944通过命令行参数提供密码可能会将密码公开给运行系统的任何人ps
jamesdlin 2014年

2
而且无论如何,尽管如果您要提前计划,此技巧很有用,但这对最初有人意外在命令行输入密码的情况没有帮助。
jamesdlin 2014年

4

避免保存到历史文件(注销之前)的另一种方法是

chmod 400 ~/.bash_history 

然后注销。停止将历史记录写入文件(因为文件是只读的),因此整个bash会话将被丢弃并保留以前的历史记录。

再次登录并将权限重置为600(或不重置,取决于您的偏执程度!)。


1

我看到反复提到

请注意,如果您设置了“ PROMPT_COMMAND = history -a” [..],这将不起作用。您必须编辑.bash_history才能将其删除。

第一部分绝对是正确的,但是您不必借助手动编辑.bash_history即可对其进行修复。如果将两个命令合而为一,则可以正常工作:

$ history
351 ssh me@site.com
352 my_password
$ history -d 352 ; history -w

您能解释一下什么使该方法真正起作用吗?
卡米尔Maciorowski

仅在显示下一个命令提示符之前执行PROMPT_COMMAND。在单独的行上输入-d和-w命令的问题是PROMPT_COMMAND将在两者之间执行history -a命令。如果您在一个命令行上同时执行-d和-w,则仅在之后执行
Floris Kruisselbrink

0

此处的许多答案都试图在将当前命令未写入bash会话之前将其$HISTFILE删除(默认为〜/ .bash_history)。但是,如果已设置PROMPT_COMMAND=history -a 命令,$HISTFILE则在命令终止后显示提示时,密码会立即写入您的密码。您必须对其进行编辑$HISTFILE才能将其删除。

此设置通常用于交错来自多个打开的bash会话的命令


-3

您还将需要检查syslog日志。无效的登录名通常会记录到syslog中。

/ var / log / messages或您的操作系统的等效文件。


1
问题不在于他输入了错误的密码,他已经登录并在提示中输入密码,然后按回车键。这不会显示在消息文件中。
MaQleod 2014年
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.