Почему вы не можете судо истории?

1547
StackOverflowed

Если я хочу просмотреть историю корневых команд, почему я не могу просто запустить sudo history? когда я делаю это, он говорит, что история команд не найдена, но если я запускаю его без sudo, он работает нормально.

Изменить: это дублированный ответ, но не дублированный вопрос к связанному. Человек, задающий любой вопрос, не будет знать, что это встроенная команда оболочки, а не двоичная.

4
Возможный дубликат [Почему не работает «sudo cd»?] (Https://superuser.com/questions/241129/why-wont-sudo-cd-work) zondo 7 лет назад 3
Этот возможный дубликат Q по сути является ответом - `history` - встроенная команда оболочки bash. Там могут быть другие журналы, записывающие, что sudo было до Xen2050 7 лет назад 0
Lol, это двойной ответ, но не дублирующий вопрос. Человек, задающий любой вопрос, не будет знать, что это встроенная команда оболочки, а не двоичная. StackOverflowed 7 лет назад 1
Это правда ... читая мой комментарий, они узнают тогда ;-) Может быть, я опубликую ответ с тем, как я проверил двоичный файл против встроенного Xen2050 7 лет назад 0

2 ответа на вопрос

5
Xen2050

historyявляется встроенной командой оболочки bash и sudoне работает со встроенными командами оболочки.


Что такое встроенная команда, а что нет?

Я использовал команду, whichкоторая «возвращает пути к файлам (или ссылкам), которые будут выполняться в среде», чтобы подтвердить, что historyэто не была внешняя (для bash) команда.

Например, бег

$ which history $ 

ничего не возвращает и код выхода равен 1 (одна или несколько указанных команд не существует или не исполняются) [FYI смотри код выхода с echo $?] во время выполнения

$ which ls /bin/ls $ 

и код выхода 0 (все указанные команды найдены и выполнимы).

Кроме того, в bash вы можете найти справку для встроенных команд с помощью help(или поиска на man bashстранице). Например, набрав

$ help history history: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg [arg...] Display or manipulate the history list. ... 

показывает справочную информацию Bash. Запуск help non-bash-commandвозвращает что-то похожее на это:

$ help ls bash: help: no help topics match `ls'. Try `help help' or `man -k ls' or `info ls'. 

и код выхода 1


Так что же делал sudo?

Вы можете искать свою собственную историю sudoкоманд вашего пользователя запускать (и не пропущен сохранением истории) с grep '^sudo' .bash_historyили history|lessили аналогичным.

Или в Ubuntu файл /var/log/auth.logхранит записи о том sudo, что делали для всех пользователей, ищет там «sudo» (другие дистрибутивы могут использовать файл /var/log/secure) или может использовать

sudo grep sudo /var/log/auth.log 

или запустить, sudo journalctl _COMM=sudoесли у вас есть systemd.

См. Вопрос «Подробно о командах sudo, выполняемых всеми пользователями» в Unix и Linux для более подробной информации.

2
Gordon Davisson

historyэто встроенная команда bash, а не обычная команда; sudoне запускает оболочку для выполнения команды, которую вы ей даете, она просто пытается выполнить ее напрямую (как обычная команда), поэтому она недоступна.

Вы можете использовать, sudo bashчтобы открыть команду оболочки root, а затем запустить history, но если вам нужна однострочная строка, это немного сложно. bash включает свой механизм истории только тогда, когда он запускается в интерактивном режиме, и если вы делаете что-то вроде sudo bash -c history( -cговорит bash «вот команда, которую я хочу, чтобы вы выполнили:»), он обрабатывает его как неинтерактивный режим и фактически не отображает любая история. Даже добавление -i(для интерактивного режима) не работало, когда я проверял это. Но это сделал:

sudo bash -i <<<history 

Обратите внимание, что <<<это функция только для bash; в других оболочках вы можете использовать echo history | sudo bash -iвместо этого.

Похожие вопросы