Почему вы не можете судо истории?
Если я хочу посмотреть историю рута в bash, почему я не могу просто запустить sudo history
? когда я это делаю, он говорит, что история команд не найдена, но если я запускаю его без sudo, он работает нормально.
Изменить: это дублированный ответ, но не дублированный вопрос к связанному. Человек, задающий любой вопрос, не будет знать, что это встроенная команда оболочки, а не двоичная.
3 ответа
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 для получения более подробной информации.
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
вместо.
А как насчет того, чтобы просто войти в систему как временный sudo и затем выполнить историю ?
Первый
sudo -s
а потом
history