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

Ram*_*mHS 64 command-line sudo

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

sudo !!什么以及如何做?

chr*_*tis 74

!!在 bash 中是前一个命令的别名(请参阅事件指示符)。因此,它会重新运行具有sudo权限的上一个命令。

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

Mit*_*tch 64

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

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

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

所以,典型的情况是你尝试一个命令,它会回退一条消息,说你必须是管理员才能做到这一点。因此,您可以输入sudo以超级用户/管理员身份运行该命令,也可以输入sudo !!where!!告诉系统使用先前尝试的命令。超高频

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

  • 如果您不能 100% 确定之前的命令是什么,那么这也是一个非常危险的命令。只需点击向上箭头,然后点击主页键,然后输入 `sudo` 并查看命令行,这几乎总是更安全。 (12认同)
  • `sudo` 并不意味着“超级用户做”,它作为 *do* 命令 *好像*我已经完成了 `su`(su 意味着 **switch** 用户 [而不是超级用户]);即,您可以以任何用户身份执行 sudo 命令,而不仅仅是 root(`-u` 开关);`su [user] [-c command]` 也是如此 (4认同)
  • @Shadur 通常您之前的命令是大约 1 秒前。正常用例是答案中描述的用例:您忘记了`sudo`某事并得到错误,因此您立即想要`sudo`它 (3认同)

Avi*_*Raj 38

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

sudo !!
Run Code Online (Sandbox Code Playgroud)

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

例如:

apt-get update
Run Code Online (Sandbox Code Playgroud)

输出将是,

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]
Run Code Online (Sandbox Code Playgroud)

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

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

这篇文中解释了其他一些bang 命令

  • 我很惊讶地看到它再次提到“砰砰”。我以为一次就够了。 (3认同)

Ada*_*hon 13

答案有两部分:!!sudo

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

$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar
Run Code Online (Sandbox Code Playgroud)

与其他扩展一样,这完全由 shell 完成,因此如果您!!在其他命令之后键入,则该命令不会意识到存在!!,而只会看到前一个命令行。(与其他扩展不同,历史扩展发生在命令被保存到历史之前,即被!!替换的命令行将被保存到历史中。)


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

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

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


所以,在这种情况下sudo !!意味着

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo !!
Run Code Online (Sandbox Code Playgroud)

基本上与

$ mount /dev/sdb1 /mnt
mount: only root can do that
$ sudo mount /dev/sdb1 /mnt
Run Code Online (Sandbox Code Playgroud)

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


Eli*_*gan 5

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

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

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

    例如,如果您的命令是lshw -c video并且您sudo !!接下来运行,那么历史扩展后的命令是sudo lshw -c video.

  2. 运行该命令。

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

但是,如果您启用shopt histverify( shopt -s histverify) 则历史扩展的工作方式不同:

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

(请注意,histverify shell 选项仅在使用 readline 库时才生效——但是当您在 Ubuntu 或其他 GNU/Linux 系统上以交互方式使用 bash 时,基本上总是如此。)

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