`!!`在`sudo !!`中是什么意思?


64

我是Ubuntu的用户,经验不足,并且一直在使用sudo

sudo !!什么,怎么做?


7
重复的,但从另一端除外:再次运行相同的命令,但以sudo的形式运行
CVn

6
@WarrenHill他不想要“如何”,而是想要“什么”和“如何”。他询问有关!!命令部分的更多信息。
Braiam 2013年

1
@Nakilon不应该。这个问题在问!!做什么和如何做。另一个想要一种方法来做到这一点。
Braiam

@MichaelKjörling你的意思是相关的吗?
Braiam

2
@Braiam实际上,我的意思是重复;对该问题的两个投票最高的答案具体说明了sudo !!做什么,而实际上有两个答案具体说明了!!做什么。
CVn

Answers:


74

!!bash中的b是上一个命令的别名(请参阅事件指示符)。因此,它将使用sudo权限重新运行先前的命令。


15
注意:!命令通常在bash脚本中不可用(仅在交互式会话中)。可以通过禁用它们set +o histexpand
Benoit

64

sudo bang bang 在命令行界面中工作时,这是一个非常有用的命令。

某些Linux发行版要求您以用户而非管理员身份登录。

因此,要以管理员身份执行某项操作,您必须使用sudo(超级用户DO)继续执行该命令,该命令告诉系统“您将执行此操作,因为我这样说。” / bang-bang(!= bang)基本上是可以用来重复上一个命令的快捷方式。

因此,典型的情况是您尝试一个命令,并且它会弹出一条消息,提示您必须是管理员才能执行此操作。所以,你可以键入sudo要运行该命令,超级用户/管理员,也可以键入sudo !!这里!!告诉系统使用已尝试了以前的命令。超高频

还有许多其他爆炸命令。有关它们的列表以及它们的解释,请查看Linux Bang命令,另请参阅Bash历史记录和bang命令


12
如果您不确定100%先前的命令是什么,这也是非常危险的命令。几乎总是比较安全的方法:先按下向上箭头,然后按下Home键,然后键入sudo并查看命令行。
Shadur

3
@Shadur通常您的上一个命令是大约1秒前。正常用例是答案中描述的用例:您忘记了sudo某件事并得到一个错误,所以您立即想要sudo
Michael Mrozek

1
@Braiam:CLI是缩写。违反社区规则!攻击!重新编辑!
印度

4
sudo并不意味着“超级用户做”,它会为一个命令,就好像我做了su(苏意切换用户[而不是超级用户]); 即,您可以以任何用户身份sudo命令,而不仅仅是root(-uswitch); su [user] [-c command]
ssice

1
@米奇su不代表这样的事情。见linux.die.net/man/1/sugnu.org/software/coreutils/manual/html_node/su-invocation.htmllinfo.org/su.html。它应该表示替代用户
ssice

38

bang bang (!!)命令是重复并运行您在终端中输入的上一个命令的快捷方式。当您忘记了执行某项操作所需的管理员权限,并且只需键入以下内容即可通过超级用户权限重复执行此命令时,该命令非常有用

sudo !!

!! 获取最后一个运行命令。

例如:

apt-get update

输出将是

E:无法打开锁定文件/ var / lib / apt / lists / lock-打开(13:权限被拒绝)
E:无法锁定目录/ var / lib / apt / lists /
E:无法打开锁定文件/ var / lib / dpkg / lock-打开(13:权限被拒绝)
E:无法锁定管理目录(/ var / lib / dpkg /),您是root吗?

之后,如果我们运行sudo !!命令,输出将是

Hit http://extras.ubuntu.com saucy/main amd64 Packages
Get:3 http://mirror.sov.uk.goscomb.net saucy-updates Release.gpg [933 B]
Hit http://ppa.launchpad.net saucy Release                                  
Hit http://extras.ubuntu.com saucy/main i386 Packages 
Hit http://mirror.sov.uk.goscomb.net saucy Release                             
99% [Waiting for headers] [Waiting for headers] [Waiting for headers]

这意味着该!!部分获取了先前的运行命令apt-get update,而前面的sudo部分使该命令以超级用户权限运行。

如何sudo !!超级用户权限前面的命令意味着运行,通常我们所有的终端上输入存储在该命令command history。运行在history终端上的命令,它会显示所有你entered.The命令!!在部分sudo !!争夺存储的最后一个命令在命令历史记录中,整个sudo !!命令以管理员权限运行最后一条命令。

博客文章中还介绍了其他一些bang命令


3
我很惊讶地看到它再次提到“爆炸”。我以为一次就足够了。
kiri

1
+1了解更多爆炸命令示例。
WernerCD 2013年

1
@Rmano至少在猛砸,我希望所有的Bourne风格的贝壳与历史的支持,mkdir LongDirectoryName并且cd !$必须单独出票工作,除非LongDirectoryName碰巧已经在前面的命令的最后一个字。出于外壳历史记录的目的,mkdir LongDirectoryName; cd !$是一个命令。历史相互作用!!!^以及!$使用最后一个命令外壳实际看到之前完全处理!这是一个例子。如果运行,history您会看到由连;成一行的命令被记住为一个命令。
伊利亚·卡根

@EliahKagan你是对的!删除了错误的信息...
Rmano

13

答案分为两部分:!!sudo

!!是外壳程序功能的一部分(在Ubuntu中,这可能是bash,但是zsh或csh等其他外壳程序也支持此功能),称为“历史扩展”。它的行为与其他扩展类似,因为外壳将“占位符”扩展为一组单词。虽然foo*将扩展为以'foo'开头的所有文件的列表,但将扩展为上一个!!命令行的内容。

$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar

与其他扩展一样,此操作完全由外壳程序完成,因此,如果!!在其他命令后键入,则该命令不会知道存在!!,而只会看到前一个命令行。(与其他扩展不同,历史扩展是在将命令保存到历史中之前发生的,也就是说!!,替换后的命令行将保存到历史中。)


sudo命令允许以其他用户身份执行命令,前提是安全策略授予了权限(默认值在中配置/etc/sudoers)。

默认情况下,root密码在Ubuntu中未设置。为了执行系统管理任务,在安装过程中创建的用户被授予sudo权限。现在,该用户只需添加prep即可以root身份在shell上执行任何命令sudo。一些GUI程序也使用sudo机制,例如程序包管理。

sudo可以以root(或另一个用户)身份执行其他命令的原因是sudo二进制(/usr/bin/sudo)在其权限中设置了setuid位,并且它属于root。设置了setuid位的任何(二进制)可执行文件都将在其所有者的许可下运行。这意味着无论哪个用户实际调用sudo,sudo都具有root权限有效运行。只有sudo的内部安全策略才能管理允许哪个用户使用什么内容,并阻止任意用户执行任意操作。


因此,在的情况下sudo !!,这意味着

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo !!

基本上与

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo mount /dev/sdb1 /mnt

只需少打字。在这两种情况下,sudo都只能mount /dev/sdb1 /mnt以root权限查看并运行它。


5

!!历史扩展的语法最简单,也许是最普遍的表达。

您可能已经注意到,在将最后执行的命令替换为之后!!,bash做两件事(在其默认配置中):

  1. 显示带有替换文本的完整命令。

    例如,如果您的命令是,然后再lshw -c video运行sudo !!,那么历史记录扩展后的命令为sudo lshw -c video

  2. 该命令运行。

通常,这两个步骤不会中断,并且没有用户互动的机会,因为shopt histverify默认情况下未设置(shopt -u histverify)。

但是,如果启用shopt histverifyshopt -s histverify),则历史记录扩展的工作方式将有所不同:

  1. 您将得到一个新的主提示,并在其上自动输入展开的文本。就像您自己键入该文本一样,光标位于末尾,但尚未运行该命令。
  2. 您(用户)必须按Enter来运行命令。或者,您可以编辑命令,取消命令(Ctrl+ C)等。请注意,这不是特殊的提示,而是常规的主要提示。确实好像您自己键入了文本。

(请注意,只有在使用readline库的情况下,histverify shell选项才会生效-但在Ubuntu或其他GNU / Linux系统上以交互方式使用bash时,实际上总是这样。)

不管是否histverify启用了shell选项,历史记录扩展都与许多其他shell扩展不同。其他Shell扩展在运行之前不会显示扩展命令。与旨在以交互方式和非交互方式(例如,在Shell脚本中)使用的其他扩展不同,历史扩展几乎总是以交互方式使用。


3

!在Linux中用于历史相关的快捷方式。所以!只会运行您执行的上一个命令。

如果您忘记将sudo放在需要该命令的命令之前,或者您获得了Permission Denied或类似的权限,这将非常有帮助

须藤!!
到此为止。


0

!! 将重复并运行前面的命令,并使用sudo赋予该命令root特权。 (它不在手册页中!!我在那里看不到它。)


对于寻找手册页的任何人:man --pager='less -p "Event Designators"' bash
Sebi
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.