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