Я пользователь Ubuntu с небольшим опытом, и я использовал sudo
.
Что sudo !!
делает и как?
!!
в bash является псевдонимом для предыдущей команды (см. Обозначения событий ). Таким образом, он повторно запускает предыдущую команду с разрешениями sudo
.
sudo bang bang
- очень полезная команда при работе в интерфейсе командной строки.
В некоторых дистрибутивах Linux вы входите как пользователь, а не как администратор.
Итак, чтобы сделать что-то административное, вы должны выполнить команду с sudo
(Super-User DO), которая говорит системе: «Вы сделаете это, потому что я так сказал». / bang-bang (! = bang) - это ярлык, который вы можете использовать, чтобы повторить предыдущую команду.
Итак, типичным сценарием является попытка команды, и она возвращает сообщение о том, что для этого вам нужно быть администратором. Таким образом, вы можете либо набрать sudo
для запуска этой команды как суперпользователь / администратор, либо вы можете набрать sudo !!
, где !!
говорит системе использовать предыдущую команду, которая была предпринята. UfH sup>
Есть много других команд bang. Список их и объяснения того, что они из себя представляют, см. В Linux Bang Commands , см. Также Bash history и bang команды
Ответ состоит из двух частей: !!
и 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.
Команда 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 !!
выполняет последнюю команду с правами администратора.
Некоторые другие команды взрыва объяснены в этом сообщении в блоге .
!!
является синтаксически самым простым и, вероятно, наиболее распространенным выражением для расширения истории .
Как вы могли заметить, после подстановки последней команды, выполненной для !!
, bash делает две вещи (в конфигурации по умолчанию):
Полная команда с замененным текстом показано вам.
Например, если ваша команда была lshw -c video
, а вы в следующий раз запускаете sudo !!
, то команда после расширения истории будет sudo lshw -c video
.
Эта команда выполняется.
Обычно эти два шага выполняются без прерывания и без возможности взаимодействия с пользователем, потому что shopt histverify
не установлен по умолчанию (shopt -u histverify
).
Однако, если вы включите shopt histverify
(shopt -s histverify
), то расширение истории будет работать по-другому:
(Обратите внимание, что опция оболочки histverify
вступает в силу только при использовании библиотеки readline - но когда вы используете bash в интерактивном режиме в Ubuntu или другом В системе GNU / Linux это всегда так.)
Независимо от того, включена ли опция оболочки histverify
, расширение истории отличается от многих других расширений оболочки. Другие расширения оболочки не показывают расширенную команду до ее запуска. В отличие от других расширений, которые предназначены для интерактивного и неинтерактивного использования (например, в сценарии оболочки), расширение истории почти всегда используется интерактивно.
! используется в Linux для ярлыков, связанных с историей Так, !! просто запустит предыдущую команду, которую вы выполнили.
Это очень полезно в тех случаях, когда вы либо забываете поставить sudo перед командой, которая требует этого, либо получаете разрешение на отказ, либо что-то в этом роде просто делаете
sudo !!и все готово.
!! Повторим и выполним предыдущую команду, и с помощью sudo она даст команде привилегию root. (Это не на странице руководства? !! Я не могу видеть это там.)