На відповідь є дві частини: !!
іsudo
!!
є частиною функціональності оболонки (у випадку Ubuntu це, мабуть, баш, але інші оболонки, такі як zsh або csh, теж підтримують це), називаються "розширенням історії". Він поводиться аналогічно, як і інші розширення, коли оболонка розширює 'заповнювач' на набір слів. Хоча foo*
буде розширено до списку всіх файлів, починаючи з 'foo', !!
розширюється до вмісту попереднього командного рядка.
$ echo foobar
foobar
$ echo !!
echo foobar
$ !!
echo foobar
Як і інші розширення, це робиться повністю оболонкою, тому, якщо ви введете !!
після якоїсь іншої команди, ця команда не усвідомлює, що там було !!
, але побачить лише попередній командний рядок. (На відміну від інших розширень, розширення історії відбувається до того, як команда буде збережена в історії, тобто замість !!
заміненого командного рядка буде збережено в історію.)
sudo
Команда дозволяє виконувати команди від імені іншого користувача, при умови дозволу ара надається політика безпеки ( по замовчуванням налаштовано в /etc/sudoers
).
За замовчуванням кореневий пароль залишається невідомим в Ubuntu. Для виконання завдань системного адміністрування користувачеві, створеному під час встановлення, надаються права sudo. Цей користувач тепер може виконувати будь-яку команду на оболонці як корінь, просто попередньо попередньо sudo
. Деякі програми GUI також використовують механізм sudo, наприклад, управління пакетами.
Причина, по якій sudo
можна виконувати інші команди як root (або інший користувач), полягає в тому, що sudo binary ( /usr/bin/sudo
) має встановлений біт setuid у своєму дозволі і належить root. Будь-який (двійковий) виконуваний файл із встановленим встановленим бітом запускається з дозволами його власника. Це означає, що 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
і запускає його з кореневими дозволами.