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

我是Ubuntu的用户,没有太多经验,我一直在使用sudo

什么是sudo !! 怎么做?

!! in bash是上一个命令的别名(请参阅事件指示符 )。 所以它使用sudo权限重新运行上一个命令。

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

一些Linux发行版让您以用户而不是管理员身份登录。

所以,为了做管理方面的事情,你必须用sudo (超级用户DO)继续执行命令,它告诉系统“你会这样做,因为我这么说。”!! / bang-bang(!= bang)基本上是一个可以用来重复上一个命令的快捷方式。

所以,典型的情况是你尝试一个命令,它会回复一条消息,说你必须是一个管理员才能做到这一点。 因此,您可以键入sudo以超级用户/ admin运行该命令,也可以键入sudo !! 哪里!! 告诉系统使用上一个尝试的命令。 和睦家医院

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

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

 sudo !! 

!! 抓取最后一次运行命令。

例如:

 apt-get update 

输出将是,

E:无法打开锁文件/ var / lib / apt / lists / lock – open(13:Permission denied)
E:无法锁定目录/ var / lib / apt / lists /
E:无法打开锁定文件/ var / lib / dpkg / lock – open(13:Permission denied)
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] 

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

怎么 sudo !! 通过超级用户权限运行上一个命令,通常我们在终端上输入的所有命令都存储在command history history 。在终端上运行history命令,它显示您输入的所有命令。 !! 参与sudo !! 抓取命令历史记录中存储的最后一个命令和整个sudo !! 使用管理员权限运行最后一个命令。

博客文章中解释了其他一些爆炸命令

答案分为两部分: !!sudo

!! 是shell的function的一部分(在Ubuntu的情况下,这可能是bash,但是像zsh或csh这样的其他shell也支持这个)称为“历史扩展”。 它的行为方式与其他扩展类似,因为shell将“占位符”扩展为一组单词。 虽然foo*会扩展为以’foo’开头的所有文件的列表, !! 扩展到上一个命令行的内容。

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

像其他扩展一样,这完全由shell完成,所以如果你键入!! 在其他一些命令之后,这个命令不知道有一个!! ,但只会看到上一个命令行。 (与其他扩展不同,历史扩展在命令保存在历史记录之前发生,而不是!!替换的命令行将保存到历史记录中。)


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

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

sudo可以以root(或其他用户)的forms执行其他命令的原因是sudo二进制文件( /usr/bin/sudo )在其权限中设置了setuid位并且属于root。 具有set setuid位的任何(二进制)可执行文件都以其所有者的权限运行。 这意味着无论用户实际调用了哪个用户,sudo都可以有效地运行root权限。 只有他对sudo的内部安全策略管理哪些用户允许什么,并防止任意用户做任意事情。


所以,在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权限运行它。

!! 是历史扩展的语法上最简单,也许是最常见的表达方式。

您可能已经注意到,在替换为执行的最后一个命令后!! ,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脚本中)不同,历史扩展几乎总是以交互方式使用。

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

如果您忘记在需要它的命令之前放置sudo,或者您获得权限被拒绝或类似的事情,这将非常有用

  sudo !! 

你已经完成了

! 将重复并运行上一个命令,并使用sudo它将为命令提供root权限。 (它不在手册页中!!!我在那里看不到它。)