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

64

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

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

RamHS
источник
7
Дубликат, кроме как с другой стороны: выполните ту же команду еще раз, но как sudo
CVn
6
@WarrenHill он хочет не «как», а «что» и «как». Он спрашивает больше о !!части команды.
Брайам
1
@ Накилон не должен быть. Этот вопрос спрашивает, что !!делать и как. Другой хочет метод сделать это.
Брайам
@ MichaelKjörling, ты имел в виду, верно?
Брайам
2
@Braiam На самом деле, я имел в виду дубликат; два наиболее высоко оцененных ответа на этот вопрос конкретно объясняют, что sudo !!делает, и есть два ответа, которые на самом деле конкретно объясняют, что !!делает.
CVN

Ответы:

74

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

chronitis
источник
15
Примечание: !команды обычно недоступны в скриптах bash (только в интерактивных сеансах). Их можно отключить с помощью set +o histexpand.
Бенуа
64

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

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

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

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

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

Митч
источник
12
Это также очень опасная команда, если вы не уверены на 100%, какой была ваша предыдущая команда. Почти всегда безопаснее просто нажать стрелку вверх, затем клавишу возврата, затем набрать sudoи посмотреть на командную строку.
Шадур
3
@Shadur Обычно ваша предыдущая команда была около 1 секунды назад. Нормальный вариант использования - тот, который описан в ответе: вы sudoчто-то забыли и получили сообщение об ошибке, поэтому вы сразу захотите sudoэтого
Michael Mrozek
1
@Braiam: CLI - это сокращение. Нарушение правил сообщества! Атака! Повторное редактирование!
индийский
4
sudoне означает «делать супер-пользователя», оно идет так же, как команда, как если бы я это делал su(su означает переключение пользователя [и не супер-пользователя]); т.е. вы можете использовать команды sudo как любой пользователь, а не только root ( -uswitch); su [user] [-c command]
То
1
@ Митч, за исключением su, не стоит за такую ​​вещь. См linux.die.net/man/1/su , gnu.org/software/coreutils/manual/html_node/su-invocation.html , linfo.org/su.html . Это должно означать замену пользователя .
ssice
38

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

sudo !!

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

Например:

apt-get update

Выход будет,

E: Не удалось открыть файл блокировки / var / lib / apt / lists / lock - открыть (13: В доступе отказано)
E: Невозможно заблокировать каталог / var / lib / apt / lists /
E: Не удалось открыть файл блокировки / var / lib / dpkg / lock - open (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.run historyкоманды на терминале, он показывает все команды , которые вы entered.The !!части в sudo !!ухватить последнюю команда хранится в истории команд и в целом sudo !!запускается последняя команда с правами администратора.

Некоторые другие команды bang описаны в этом посте .

Авинаш Радж
источник
3
Я удивлен, когда снова упомянул «взрыв». Я думал, что однажды было достаточно.
Кири
1
+1 для большего количества примеров команд взрыва.
WernerCD
1
@Rmano По крайней мере, в Bash, и я ожидаю, что все оболочки в стиле Борна с поддержкой истории, mkdir LongDirectoryNameи cd !$должны быть выпущены отдельно, чтобы работать, если только LongDirectoryNameэто не было последним словом предыдущей команды. Для целей истории оболочки, mkdir LongDirectoryName; cd !$это одна команда. История взаимодействия с !!, !^и !$использование последней команды, которую оболочка фактически полностью обработала перед просмотром !. Вот пример. Если вы запустите, historyвы увидите, что команды в строке, к которой ;они присоединены , запоминаются как одна команда.
Элия ​​Каган
@EliahKagan ты прав! Удалена неправильная информация ...
Rmano
13

Ответ состоит из двух частей: !!и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.

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

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

Элия ​​Каган
источник
3

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

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

судо !!
и вы сделали.

tapananand
источник
0

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

Farimah
источник
Для тех, кто ищет man --pager='less -p "Event Designators"' bash
Себи,