我很困惑为什么我在以另一个用户身份执行历史命令以返回该用户的所有历史记录时遇到问题 - 我需要循环遍历所有用户并获取他们的历史记录
cat /etc/passwd | awk -F: '{print $1}' > ${system}.users.txt
while read username; do
echo $username
sudo -u $username bash -c 'export HISTTIMEFORMAT="%F %T "; history' >../log/${username}.hist
#sudo -u $username bash -c 'export HISTTIMEFORMAT="%F %T "; history'
done < ./${system}.users.txt
当我运行时没有得到历史记录输出:
sudo -u anotheruser history
为了解决问题,我尝试了:
sudo -u anotheruser bash -c 'which history'
我还跑了:
sudo find / -name 'history' -type f
但我没有返回任何可执行文件。
谁能告诉我为什么 sudo 命令不能由其他用户执行?
答案1
(1)history
是 shell 内置命令;没有可执行文件
(2)bash -c
使bash
非交互式 shell 不使用历史记录。这没有很好的文档记录,但我需要 和-i
才能set -o history
使用 来将历史记录放入 shell 中-c
:
bash -ic 'set -o history; history'
(在 RedHat 4.1.2(1) 和 Ubuntu 4.3.11(1) 上测试)
(3)默认情况下,时间戳不会写入历史文件,因此,除非您(之前)已HISTTIMEFORMAT
为用户设置/强制执行,或者他们(之前)故意设置,否则从历史文件读取的行/条目将(全部)具有当前时间
(4)sudo
更改用户 ID 和组 ID,但不更改环境的其余部分,因此您的命令将查找运行它的用户的历史文件,而不是$username
;添加-i
(5)直接读取可能更容易$5/.bash_history
——至少对于运行 bash 并拥有主目录的用户来说是这样,而系统用户大多不会这样做