当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

我是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会执行两项操作(在默认配置中):

  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)等。请注意,这不是特殊提示,而是常规主提示。这就像你自己输入文本一样。

(请注意,只有在使用the readline library时,histverify shell option才会生效 – 但是当您在Ubuntu或其他GNU /Linux系统上以交互方式使用bash时,基本上总是这样。)

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

第六种方案

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

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

sudo !!

你已经完成了

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1072.html,未经允许,请勿转载。