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