Что делает «!!» означает «sudo !!»?

64

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

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

    
задан RamHS 18.11.2013 в 11:24
источник

7 ответов

74

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

    
ответ дан chronitis 18.11.2013 в 11:28
источник
64

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

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

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

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

Есть много других команд. Для получения списка и объяснений того, что у них есть, ознакомьтесь с командами Linux Bang, см. Также Команды истории и удара Bash

    
ответ дан Mitch 18.11.2013 в 11:31
38

Команда 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 .Run% history на терминал показывает все введенные вами команды. !! в sudo !! захватывает последнюю команду, сохраненную в истории команд, а весь sudo !! запускает последнюю команду с правами администратора.

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

    
ответ дан Avinash Raj 18.11.2013 в 12:05
13

В ответе есть две части: !! и sudo

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

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

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

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

По умолчанию пароль root не установлен в Ubuntu. Для выполнения задач системного администрирования пользователь, созданный во время установки, получает права sudo. Теперь этот пользователь может выполнить любую команду в оболочке как root, просто добавив sudo . Некоторые GUI-программы также используют механизм 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.

    
ответ дан Adaephon 21.11.2013 в 00:28
5

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

Как вы могли заметить, после замены последней команды, выполненной для !! , bash выполняет две вещи (в своей конфигурации по умолчанию):

  1. Вам будет показана полная команда с замещенным текстом.

    Например, если ваша команда была lshw -c video и вы запускаете sudo !! next, тогда команда после расширения истории будет 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 , расширение истории отличается от многих других расширений оболочки. Другие расширения оболочки не показывают вам расширенную команду перед ее запуском. В отличие от других расширений, которые предназначены для использования как интерактивно, так и невзаимодействующим (например, в сценарии оболочки), расширение истории почти всегда используется в интерактивном режиме.

    
ответ дан Eliah Kagan 23.04.2015 в 19:47
3

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

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

sudo !!
, и все готово.     
ответ дан tapananand 21.11.2013 в 20:09
0

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

    
ответ дан Farimah 18.11.2013 в 20:49