为什么你不能 sudo 历史?

Sta*_*wed 5 linux sudo bash history command-history

如果我想查看 root 的 bash 历史记录,为什么我不能直接运行sudo history?当我这样做时,它说找不到命令历史记录,但是如果我在没有 sudo 的情况下运行它,它运行良好。

编辑:这是一个重复的答案,但不是链接的重复问题。提出任何一个问题的人都不知道它是一个 shell 内置命令,而不是一个二进制命令。

Xen*_*050 6

history是 bash shell 内置命令,sudo不适用于 shell 内置命令。


什么是内置命令,什么不是?

我用的命令which“返回这将在环境中执行的文件(或链接)的路径名”,确认history不属于外部(到bash)的命令。

例如,运行

$ which history
$
Run Code Online (Sandbox Code Playgroud)

不返回任何内容并且退出代码为 1(一个或多个指定的命令不存在或不可执行)[仅供参考echo $?,在运行时看到带有]的退出代码

$ which ls
/bin/ls
$
Run Code Online (Sandbox Code Playgroud)

和退出代码 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.
...
Run Code Online (Sandbox Code Playgroud)

显示 bash 的帮助信息。运行help non-bash-command返回与此类似的内容:

$ help ls
bash: help: no help topics match `ls'.  Try `help help' or `man -k ls' or
`info ls'.
Run Code Online (Sandbox Code Playgroud)

和退出代码 1


那么 sudo 一直在做什么?

您可以在您自己的历史记录中搜索您的sudo用户使用grep '^sudo' .bash_historyhistory|less或类似的命令运行(而不是跳过将其保存到历史记录)。

或者,在 Ubuntu 上,该文件/var/log/auth.log会记录sudo所有用户所做的事情,在其中搜索“sudo”(其他发行版可能会使用该文件/var/log/secure),或者可以使用

sudo grep sudo /var/log/auth.log
Run Code Online (Sandbox Code Playgroud)

或者sudo journalctl _COMM=sudo如果你有 systemd 就运行。

有关更多详细信息,请参阅Unix 和 Linux 上的问题“有关所有用户执行的 sudo 命令的详细信息”