Запустите ту же команду еще раз, но от имени root


117

Иногда, когда я запускаю команду, я не замечаю, что мне нужно было запускать ее как суперпользователь, чтобы иметь достаточно прав.

Есть ли способ запустить ту же команду еще раз, но как суперпользователь?

Ответы:


196

Самый простой способ - запустить:

sudo !!

Это запустит последнюю команду, но как суперпользователь.

Источник .


5
Я нашел это весьма полезным, и я никогда не сталкивался с этим раньше (хотя это может быть общеизвестно). Я не смог найти его на сайте, поэтому я решил ответить сам.
Труфа

30
Кроме того, выполнение !!самостоятельно запускает вашу предыдущую команду согласно сохраненной в history. Кроме того, делать !-1, !-2и так далее выполняет свою последнюю команду, вторую последнюю команду, и так далее. Handy!
oaskamay

6
Как еще один в стороне, !<command>будет выполнять последнее событие с ~/.bash_historyэтого начала<command>
Раду Rădeanu

1
Ctrl-R также очень полезен. в вашей истории он будет искать команды, совпадающие с набранными вами. Это позволит вам отредактировать команду перед ее повторным
запуском

4
Эта глупая !копия, созданная с помощью bash, tcshприводила меня в замешательство больше, чем когда-либо. Двойные кавычки не защищают от интерпретации !. $ foo "!bar"-> !bar: event not found.
Каз

70

​​​​​​​​​​​​​​​​​​​​​​​​​​​​​введите описание изображения здесь

ответ : вы вводите sudo !!сразу после этого, чтобы повторить предыдущую команду с повышенными привилегиями.

редактировать: изображение, найденное через Reddit , и это пародия на оригинальный комикс xkcd Рэндалла Манро.


3
пожалуйста, не вступайте в дискуссию за или против здесь в комментариях. Если вы хотите обсудить существо или иное, пожалуйста, используйте Meta. Благодарю.
fossfreedom

17

Вы можете использовать клавишу со стрелкой вверх, чтобы прокрутить ваши старые команды, переписать / изменить их и добавить sudoперед ними. (кнопка «Домой» над клавишами со стрелками установит позицию в начало.)

Мне не нравится эта sudo !!идея, потому что иногда вы добавляете другую команду между ними и больше не помните.


1
К счастью, когда вы это сделаете sudo !!, оболочка развернется !!, и вы сможете увидеть, какую команду она пытается запустить. Таким образом, может вызвать раздражение, когда вы нажмете Ctrl-C и найдете правильную команду, но это, по крайней мере, не заставит вас застать врасплох.
Рейд

4
@Reid Это не будет расширяться до тех пор , после того, как вы нажмете ввести, и если вы в этом окне , где вы не должны снова ввести пароль, он будет работать без подтверждения. +1 к использованию истории вместо слепого использования!!
Изката

5
@Izkata: Полагаю, это правда. Я использую zsh, поэтому я просто набираю текст, sudo !!<TAB>и он автоматически заполняется !!для меня. Bash может расширить историю с помощью M-^(для меня alt + shift + 6), но это не так легко (хотя вы можете перепривязать это). Существует также shopt -s histverify, что делает так, что когда вы используете раскрытие истории и нажимаете ввод, вместо этого выдается еще одна строка подсказки с выполненным расширением, чтобы вы могли ее увидеть / отредактировать.
Рейд

1
Я больше думал о ситуации, когда я набрал команду, команда вернула, что в разрешении было отказано, и я знаю, что хочу снова выполнить ту же самую команду, но как sudo, процесс нажатия вверх, home, ввода sudo и ощущения очень медленнее для меня. Это то, как я делал это всегда, и это было просто неэффективно.
Труфа

@Reid: shopt -s histverifyне поможет ни капли . Большинство людей привыкнет наносить удары Enterдважды. В этот момент они еще слишком поздно, чтобы проверить, что случилось.
Фрэнк Кастерс

13

Я просто добавлю альтернативу: короткую, как печатать, sudo !!и более гибкую:

Up-arrow (once, or until you find the command you want to sudo/edit, if it's older)
ctrl+A   (place cursor at beginning of line)
"sudo "
Enter

Это точно такое же количество нажатий клавиш (я считаю "ctrl + A" как один ...), но добавив "стрелку вверх", вы можете сделать это с любой командой в вашей истории.


1
Ctrl + A из привязок emacs, вы также можете использовать привязки vi ( set -o vi). Затем вы можете Escape (перейти в командный режим), а затем «I» (заглавная «i», вставить в начале строки).
Герхард Бургер

1
@GerhardBurger: Я знаю, но, как ни странно, я люблю vi (особенно vim) для редактирования многострочных документов, но я очень предпочитаю привязку emacs в оболочке (необходимость переключаться из команды в режим редактирования в оболочке не действительно, имеет смысл, имхо, и ярлыков emacs вполне достаточно для повседневного использования, даже если они менее мощные)
Оливье Дюлак

Правда, я добавил это только для полноты, для меня это то же самое, однако поиск с помощью '/' очень удобен;)
Герхард Бургер

@GerhardBurger: о "/" режима vi в обычном (связывание с emacs) bash также есть очень удобный способ найти предыдущие команды, набирая несколько букв, затем нажимая ctrl + r, пока не найдете его
Оливье Дюлак

7

Есть несколько способов сделать это

  • Просто введите команду еще раз, добавив sudoперед командой

  • Нажмите, Up arrowчтобы получить последнюю команду и поставить sudoперед ней.

  • Войти sudo !!

В !!разрастается до последней введенной команды. Вы можете делать подобные вещи с другими вещами с историей командной строки, смотрите здесь


7

Этот вопрос можно было бы обобщить на « Выполнить ту же команду, но с некоторой модификацией », поскольку одно из блестящих дизайнерских решений в Unix заключается в том, что то, что реализовано однажды в оболочке, может быть использовано любой командой, вызываемой из оболочки.

Другими словами, этот трюк не относится только к sudo:

  • Повторите предыдущую команду как суперпользователь ( sudo !!)
  • Повторите предыдущую команду и время ее ( time !!)
  • Повторите предыдущую команду с другой средой ( env A=b B=z !!)
  • Повторите предыдущую команду ( !!)

Расширение истории (также известное как подстановка истории) - это просто функция оболочки, облегчающая повторение предыдущих команд (с меньшим количеством нажатий клавиш). Проверьте свою страницу руководства оболочки для history expansion. Он описывает еще много трюков и ярлыков, которые вы можете сделать с историей, например:

Вы можете ссылаться на предыдущие команды по номеру:

!55                 # repeat command number 55
!-1                 # repeat the previous command, alias for !!
!-2                 # repeat the command before the previous command

Вы можете ссылаться на отдельные слова в предыдущих командах:

some-command !$     # run some-command on the last arg of previous command

Вы также можете выполнить поиск перед повторением:

!?awk               # repeat the last command including the string 'awk'

Вы можете искать в истории и заменить что-то другим:

!?awk?:s/str1/str2/  # repeat previous command matching 'awk' replacing str1 by str2

И многое другое, так как вы можете комбинировать команды выбора, arg-selection, поиска и замены независимо.

Страница man вашей оболочки (в данном случае man bash) - ваш друг.


1
Briliant! тот должен быть принятым ответом.
Элиран Малка

5

Я использую zsh вместо bash, и у меня это есть ~/.zshrc, поэтому нажатие Alt+ Sвставляет sudoв начало командной строки:

insert_sudo () { zle beginning-of-line; zle -U "sudo " }
zle -N insert-sudo insert_sudo
bindkey "^[s" insert-sudo

К сожалению, я не смог найти способ сделать то же самое в bash.


3
Вы можете легко сделать то же самое в Bash, используя GNU Readline: добавьте к своему, ~/.inputrc "\es":"\C-asudo "и вы перейдете к началу длинной строки, а sudo будет вставлено в начало строки после нажатия alt-s. Перезапустите терминал или перечитайте, ~/.inputrcчтобы он заработал.

2

Если вы хотите сделать это в псевдониме, вы должны использовать alias redo='sudo $(history -p !!)'по какой-то причине.


1
su -c "!!"

Если у вас нет прав на получение прав root с помощью sudo или программа sudo не была установлена ​​в системе.


1

То, как я предпочитаю это:

  • Стрелка вверх
  • Главная
  • "судо"
  • Войти

Но может быть проще просто сделать "sudo !!", решать только вам.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.