4

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

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

2 ответа2

5

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

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

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

sudo bash -i <<<history

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .