Що означає "!!" у "sudo !!"?


64

Я користувач Ubuntu, який не має великого досвіду, і я цим користувався sudo.

Що робить sudo !!і як?


7
Дублікат, за винятком іншого боку: Виконайте ще одну команду, але як sudo
CVn

6
@WarrenHill він не хоче "як", а "що" і "як". Він запитав більше про !!частину команди.
Брайам

1
@Nakilon не повинен бути. Це питання задає питання, що !!робити і як. Інший хоче, щоб це зробити методом.
Брайам

@ MichaelKjörling Ви мали на увазі споріднене право?
Брайам

2
@Braiam Насправді я мав на увазі дублікат; два відповіді з найвищими голосами на це конкретно пояснюють, що sudo !!робить, і є два відповіді, які насправді пояснюють, що !!робить.
CVn

Відповіді:


74

!!у bash - псевдонім для попередньої команди (див. Дизайнери подій ). Тож він запускає попередню команду з sudoдозволами.


15
Примітка: !команди зазвичай недоступні у скриптах bash (лише в інтерактивних сесіях). Їх можна відключити set +o histexpand.
Бенуа

64

sudo bang bang є дуже корисною командою при роботі в інтерфейсі командного рядка.

У деяких дистрибутивах Linux ви ввійшли як користувач замість адміністратора.

Отже, щоб зробити щось адміністративно, вам потрібно продовжити команду sudo(Super-User DO), яка скаже системі "ви зробите це, тому що я це сказав". / bang-bang (! = чумка) - це в основному ярлик, який можна використовувати для повторення попередньої команди.

Отже, типовим сценарієм є те, що ви намагаєтеся виконати команду, і вона відкидає повідомлення про те, що для цього потрібно бути адміністратором. Отже, ви можете або ввести, sudoщоб запустити цю команду як суперкористувач / адміністратор, або ви можете ввести, sudo !!де !!вказує системі використовувати попередню команду, яку було зроблено. UfH

Є багато інших ударних команд. Щоб ознайомитись з їх списком та поясненнями, що вони є, перегляньте команди Linux Bang Commands , також див. Історію Bash та команди bang


12
Це також дуже небезпечна команда, якщо ви не на 100% впевнені, якою була ваша попередня команда. Майже завжди безпечніше просто натиснути стрілку вгору, потім клавішу додому, а потім набрати sudoта переглянути командний рядок.
Шадур

3
@Shadur Зазвичай ваша попередня команда була близько 1 секунди тому. Нормальний випадок використання є описаний у відповідь: ви забули sudoщо - то і отримати помилку, так що ви відразу хочете sudoнього
Майкл Mrozek

1
@Braiam: CLI - це абревіатура. Порушення правил спільноти! Атака! Перередагуйте!
Індійський

4
sudoне означає "робити суперкористувач", він також виконує команду, як ніби я це зробив su(значить, користувач перемикає [а не супер користувач]); тобто ви можете використовувати sudo команди як будь-який користувач, не тільки root ( -uперемикач); те саме ідеsu [user] [-c command]
ssice

1
@Mitch за винятком таких дій 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 / list / lock - відкрити (13: Дозвіл відхилено)
E: Не вдається заблокувати каталог / var / lib / apt / list /
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]

Що означає, що !!частина захоплює попередню команду run, apt-get updateа попередня sudoчастина робить команду для запуску з правами суперпользователя.

І як ці sudo !!пробіги попередня команди з привілеями суперкористувача кошти, зазвичай все команди , які ми вступили на терміналі, зберігаються в command history.run historyкоманди на терміналі, він показує всі команди , які ви entered.The !!частини в sudo !!ухопити останню команда зберігається в історії команд і весь sudo !!запускає останню команду з правами адміністратора.

У цьому дописі в блозі пояснюються деякі інші команди чуб .


3
Я здивований, коли знову згадував про "чуток". Я думав, що одного разу вистачить.
кірі

1
+1 для отримання додаткових прикладів команд удар.
WernerCD

1
@Rmano Принаймні в Bash, і я очікую, що всі оболонки в стилі Борна з підтримкою історії, mkdir LongDirectoryNameі вони cd !$повинні видаватися окремо для роботи, якщо не LongDirectoryNameтрапляється останнє слово попередньої команди. Для цілей історії оболонок - mkdir LongDirectoryName; cd !$це одна команда. Історія взаємодії з !!, !^та !$використання останньої команди, оболонка фактично повністю оброблена перед переглядом !. Ось приклад. Якщо ви запустите, historyви побачите, що команди в рядку, до якого приєднується ;, запам'ятовуються як одна команда.
Елія Каган

@EliahKagan ви праві! Видалено неправильну інформацію ...
Rmano

13

На відповідь є дві частини: !!і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і запускає його з кореневими дозволами.


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 оболонки набуває чинності лише в тому випадку, якщо використовується бібліотека читальних ліній, але якщо ви інтерактивно використовуєте bash в Ubuntu або іншій системі GNU / Linux, це, по суті, завжди так.)

Якщо histverifyввімкнено параметр оболонки чи ні , розширення історії відрізняється від багатьох інших розширень оболонок. Інші розширення оболонки не показують вам розгорнуту команду до її запуску. На відміну від інших розширень, які призначені для використання як інтерактивно, так і неінтерактивно (наприклад, у сценарії оболонки), розширення історії майже завжди використовується інтерактивно.


3

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

Це дуже корисно у випадках, коли ви або забудете поставити sudo перед командою, яка вимагає цього, або ви отримаєте дозвіл відхилено або щось подібне просто зробіть

судо !!
і ви закінчили.


0

!! повторить і запустить попередню команду, а з sudo вона дасть команді кореневу привілей. (Це не на сторінці людини? !! Я не можу це бачити.)


Для всіх, хто шукає сторінку чоловіка:man --pager='less -p "Event Designators"' bash
Sebi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.