`!!`在`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做了两件事(默认配置):
-
将显示带有替换文本的完整命令。
例如,如果您的命令是
lshw -c video
并且您运行sudo !!
接下来,历史扩展后的命令是sudo lshw -c video
。 -
该命令运行。
通常,这两个步骤不间断地发生,并且没有用户交互的机会,因为缺省情况下shopt histverify
未设置( shopt -u histverify
)。
但是,如果启用shopt histverify
( shopt -s histverify
),则历史记录扩展的工作方式不同:
- 您将获得一个新的主要提示,并在其上自动输入扩展文本。 就好像你自己输入了那个文本一样,光标在最后,但还没有运行命令。
- 您(用户)必须按Enter键才能运行该命令。 或者您可以编辑命令,取消它( Ctrl + C )等。请注意,这不是特殊提示,而是常规主提示。 这就像你自己输入文本一样。
(请注意,只有在使用readline库时 , histverify
shell选项才会生效 – 但是当您在Ubuntu或其他GNU / Linux系统上以交互方式使用bash时,基本上总是如此。)
无论是否启用了histverify
shell选项 ,历史记录扩展都与许多其他shell扩展不同。 其他shell扩展在运行之前不会显示扩展命令。 与其他旨在以交互方式和非交互方式使用的扩展(例如,在shell脚本中)不同,历史扩展几乎总是以交互方式使用。
! 在Linux中用于历史相关的快捷方式。 所以,!! 将只运行您执行的上一个命令。
如果您忘记在需要它的命令之前放置sudo,或者您获得权限被拒绝或类似的事情,这将非常有用
sudo !!
你已经完成了
! 将重复并运行上一个命令,并使用sudo它将为命令提供root权限。 (它不在手册页中!!!我在那里看不到它。)