问题描述
我是Ubuntu的用户,没有太多经验,我一直在使用sudo
。
sudo !!
做什么以及如何做?
最佳解决方案
bash中的!!
是上一个命令的别名(请参阅Event Designators)。所以它re-runs以前的命令具有sudo
权限。
次佳解决方案
在命令行界面中工作时,sudo bang bang
是一个非常有用的命令。
一些Linux发行版让您以用户而不是管理员身份登录。
所以,要做一些事情admin-wise,你必须用sudo
(Super-User DO)继续执行命令,它告诉系统“你会这样做,因为我这么说。”!! /bang-bang(!= bang)基本上是一个可以用来重复上一个命令的快捷方式。
所以,典型的情况是你尝试一个命令,它会回复一条消息,说你必须是一个管理员才能做到这一点。因此,您可以键入sudo
以将该命令作为super-user /admin运行,也可以键入sudo !!
,其中!!
告诉系统使用上一个尝试的命令。 UfH
还有很多其他的bang-commands。有关它们的列表及其解释,请查看Linux Bang Commands,另请参阅Bash history and bang commands
第三种解决方案
bang bang (!!)
命令是重复和运行您在终端中输入的上一个命令的快捷方式。当您忘记需要管理员权限才能执行某项操作时,此命令非常有用,并且只需键入即可使用super-user权限重复此命令,
sudo !!
!!
获取最后一次运行命令。
例如:
apt-get update
输出将是,
E: Could not open lock file /var/lib/apt/lists/lock – open (13: Permission denied)
E: Unable to lock directory /var/lib/apt/lists/
E: Could not open lock file /var/lib/dpkg/lock – open (13: Permission denied)
E: Unable to lock the administration directory (/var/lib/dpkg/), are you 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
命令,它显示您输入的所有命令.sudo !!
中的!!
部分获取存储在命令历史记录中的最后一个命令,整个sudo !!
运行具有管理员权限的最后一个命令。
此blog post中解释了一些其他爆炸命令。
第四种方案
答案分为两部分:!!
和sudo
!!
是shell的功能的一部分(在Ubuntu的情况下,这可能是bash,但是其他shell,如zsh或csh也支持这个),称为”history expansion”。它的行为方式与其他扩展类似,因为shell将’placeholder’扩展为一组单词。虽然foo*
将扩展为以’foo’开头的所有文件的列表,但!!
将扩展为上一个命令行的内容。
$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar
与其他扩展一样,这完全由shell完成,因此如果在其他命令之后键入!!
,则此命令不知道存在!!
,但只会看到上一个命令行。 (与其他扩展不同,历史扩展在命令保存在历史记录之前发生,即代替!!
,替换的命令行将保存到历史记录中。)
sudo
命令允许以另一个用户身份执行命令,前提是安全策略授予了权限(默认配置为/etc/sudoers
)。
默认情况下,root密码在Ubuntu中保持未设置状态。为了执行系统管理任务,在安装期间创建的用户被授予sudo权限。此用户现在可以以root身份在shell上执行任何命令,只需预先添加sudo
即可。一些GUI程序也使用sudo机制,例如包管理。
sudo
可以作为root(或其他用户)执行其他命令的原因是sudo二进制文件(/usr/bin/sudo
)在其权限中设置了setuid位并且属于root。具有set setuid位的任何(二进制)可执行文件都以其所有者的权限运行。这意味着无论用户实际调用了哪个用户,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权限运行它。
第五种方案
!!
是history expansion的语法上最简单且可能最常见的表达。
您可能已经注意到,在替换为!!
执行的最后一个命令后,bash会执行两项操作(在默认配置中):
-
将显示带有替换文本的完整命令。例如,如果您的命令是
lshw -c video
并且接下来运行sudo !!
,则历史记录扩展后的命令是sudo lshw -c video
。 -
该命令运行。
通常情况下,这两个步骤不会中断,也没有用户交互的机会,因为默认情况下未设置shopt histverify
(shopt -u histverify
)。
但是,如果启用shopt histverify
(shopt -s histverify
),则历史记录扩展的工作方式不同:
-
您将获得一个新的主要提示,并在其上自动输入扩展文本。就好像你自己输入了那个文本一样,光标在最后,但还没有运行命令。
-
然后,您,用户必须按
Enter
才能运行该命令。或者您可以编辑命令,取消它(Ctrl
+C
)等。请注意,这不是特殊提示,而是常规主提示。这就像你自己输入文本一样。
(请注意,只有在使用the readline library时,histverify
shell option才会生效 – 但是当您在Ubuntu或其他GNU /Linux系统上以交互方式使用bash时,基本上总是这样。)
无论是否启用了histverify
shell选项,历史记录扩展都与许多其他shell扩展不同。其他shell扩展在运行之前不会显示扩展命令。与其他旨在以交互方式和非交互方式使用的扩展(例如,在shell脚本中)不同,历史扩展几乎总是以交互方式使用。
第六种方案
!在Linux中用于历史相关的快捷方式。所以,!!将只运行您执行的上一个命令。
如果您忘记在需要它的命令之前放置sudo,或者您获得权限被拒绝或类似的事情,这将非常有用
sudo !!
你已经完成了