Что значит `!!` в `sudo !!`?

Я пользователь Ubuntu с небольшим опытом, и я использовал sudo.

Что sudo !! делает и как?

64
задан 11 February 2014 в 15:23

7 ответов

!! в bash является псевдонимом для предыдущей команды (см. Обозначения событий ). Таким образом, он повторно запускает предыдущую команду с разрешениями sudo.

0
ответ дан 11 February 2014 в 15:23

sudo bang bang - очень полезная команда при работе в интерфейсе командной строки.

В некоторых дистрибутивах Linux вы входите как пользователь, а не как администратор.

Итак, чтобы сделать что-то административное, вы должны выполнить команду с sudo (Super-User DO), которая говорит системе: «Вы сделаете это, потому что я так сказал». / bang-bang (! = bang) - это ярлык, который вы можете использовать, чтобы повторить предыдущую команду.

Итак, типичным сценарием является попытка команды, и она возвращает сообщение о том, что для этого вам нужно быть администратором. Таким образом, вы можете либо набрать sudo для запуска этой команды как суперпользователь / администратор, либо вы можете набрать sudo !!, где !! говорит системе использовать предыдущую команду, которая была предпринята. UfH

Есть много других команд bang. Список их и объяснения того, что они из себя представляют, см. В Linux Bang Commands , см. Также Bash history и bang команды

0
ответ дан 11 February 2014 в 15:23

Ответ состоит из двух частей: !! и sudo

!! является частью функциональности оболочки (в случае с Ubuntu это, вероятно, bash, но другие оболочки вроде zsh или csh тоже это поддерживают) называется "расширением истории". Он ведет себя аналогично другим расширениям в том, что оболочка расширяет «заполнитель» до набора слов. В то время как foo* будет расширен до списка всех файлов, начинающихся с 'foo', !! будет расширен до содержимого предыдущей командной строки.

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

Как и другие расширения, это делается полностью оболочкой, поэтому, если вы наберете !! после какой-то другой команды, эта команда не будет знать, что было !!, но увидит только предыдущая командная строка. (В отличие от других расширений, расширение истории происходит до сохранения команды в истории, то есть вместо !! замененная командная строка будет сохранена в истории.)


Команда sudo позволяет выполнять команды от имени другого пользователя при условии, что права доступа предоставлены политикой безопасности (по умолчанию настроено в /etc/sudoers).

По умолчанию пароль пользователя root не установлен в Ubuntu. Для выполнения задач системного администрирования пользователю, созданному во время установки, предоставляются права sudo. Теперь этот пользователь может выполнить любую команду в оболочке от имени пользователя root, просто добавив sudo. Некоторые программы с графическим интерфейсом также используют механизм sudo, например, управление пакетами.

Причина, по которой sudo может выполнять другие команды от имени пользователя root (или другого пользователя), заключается в том, что двоичный файл sudo (/usr/bin/sudo) имеет бит setuid, установленный в его разрешении, и принадлежит root. Любой (двоичный) исполняемый файл с установленным битом 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.

0
ответ дан 11 February 2014 в 15:23

Команда bang bang (!!) является ярлыком для повтора и запуска предыдущей команды , введенной вами в вашем терминале. Эта команда очень полезна, когда вы забываете, что вам нужны права администратора для выполнения определенного действия, и позволяет вам повторить ее с правами суперпользователя, просто набрав:

sudo !!

!! захватывает команду последнего запуска .

Например:

apt-get update

Вывод будет,

E: Не удалось открыть файл блокировки / var / lib / apt / lists / lock - open (13 : Разрешение запрещено)
E: невозможно заблокировать каталог / var / lib / apt / lists /
E: не удалось открыть файл блокировки / var / lib / dpkg / lock - открыть (13 : В доступе отказано)
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]

Это означает, что часть !! захватывает предыдущую команду запуска apt-get update, а предыдущая часть sudo заставляет команду работать с правами суперпользователя .

И , как sudo !! выполняет предыдущую команду с привилегиями суперпользователя, обычно все команды, которые мы вводили на терминале, сохраняются в command history. Выполните команду history на терминале , он показывает все введенные вами команды. Часть !! в sudo !! захватывает последнюю команду, сохраненную в истории команд, и весь sudo !! выполняет последнюю команду с правами администратора.

Некоторые другие команды взрыва объяснены в этом сообщении в блоге .

0
ответ дан 11 February 2014 в 15:23

!! является синтаксически самым простым и, вероятно, наиболее распространенным выражением для расширения истории .

Как вы могли заметить, после подстановки последней команды, выполненной для !!, 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 вступает в силу только при использовании библиотеки readline - но когда вы используете bash в интерактивном режиме в Ubuntu или другом В системе GNU / Linux это всегда так.)

Независимо от того, включена ли опция оболочки histverify , расширение истории отличается от многих других расширений оболочки. Другие расширения оболочки не показывают расширенную команду до ее запуска. В отличие от других расширений, которые предназначены для интерактивного и неинтерактивного использования (например, в сценарии оболочки), расширение истории почти всегда используется интерактивно.

0
ответ дан 11 February 2014 в 15:23

! используется в Linux для ярлыков, связанных с историей Так, !! просто запустит предыдущую команду, которую вы выполнили.

Это очень полезно в тех случаях, когда вы либо забываете поставить sudo перед командой, которая требует этого, либо получаете разрешение на отказ, либо что-то в этом роде просто делаете

sudo !!
и все готово.
0
ответ дан 11 February 2014 в 15:23

!! Повторим и выполним предыдущую команду, и с помощью sudo она даст команде привилегию root. (Это не на странице руководства? !! Я не могу видеть это там.)

0
ответ дан 11 February 2014 в 15:23

Другие вопросы по тегам:

Похожие вопросы: