如果我是一个普通用户并且我输入
history
我得到了在终端中输入的一组命令。
现在我让自己成为 sudo su (su 代表超级用户,而不是替代用户)
sudo su
我正在再次输入历史同一航站楼
history
我得到了一组与我之前输入的不同命令。
我在个人工作站上工作。没有其他人管理该工作站。除了我之外,没有其他用户在工作站上注册。即使我获得了 su(超级用户)权限,我也将使用这些权限。
因此,我想获得整个系统的相同历史记录,无论是超级用户还是普通用户。
如何实现这一点?
答案1
history
$SHELL
由您的通过$HISTFILE
和环境变量处理$HISTFILESIZE
。阅读man $SHELL
。
sudo
和都su
控制所执行命令的环境。读取man su;for i in sudo sudo.conf sudo_root sudoers ; do man $i; done
你可以控制你的 shell 历史记录,参见我的回答使用多个终端进行 Bash 历史记录处理。
如果您避免sudo su
使用 而只使用sudo
,您的root
命令也将被记录。如果命令之间间隔超过 5 分钟(默认情况下),您将必须重新输入您的登录密码sudo
。在我看来,这是更现代的系统管理方法。
答案2
大多数兼容 POSIX 的 shell 使用环境变量的值$历史文件确定从何处引导有关命令历史记录的读/写活动。我认为,我看到了多种实现所需统一 shell 历史记录的选项。其中最直接的四个是:
仅为 root 用户更改 shell 配置
将 HISTFILE 变量的定义添加到 root 用户的 shell 启动文件(BaSH 的 .bashrc、Z Shell 的 .zshrc、TENEX C Shell 的 .tcshrc 等;位于以下命令末尾)
systemctl --user show-environment | grep HISTFILE | sudo tee -a /root/.bashrc
修改全局(系统范围,影响所有用户)配置
仅更改单个 shell 的行为(例如 bash 但不更改 tcsh)
将 HISTFILE 的定义添加到您选择的 shell 的全局/系统配置文件中(BaSH 的 /etc/bash.bashrc、Z Shell 的 /etc/zsh/zshrc 等),这将影响系统上的所有用户,前提是他们没有在其用户 shell 文件中明确设置 HISTFILE 的值。如果您选择此方法并且没有结果,您可能需要从 /root/.{bash,zsh,tcsh}rc 中删除包含 HISTFILE 的行。
systemctl --user show-environment | grep HISTFILE | sudo tee -a /etc/bash.bashrc
改变 sudo 的行为,以便所有 shell 都会受到影响(bash、zsh、ksh 等)
该
sudo
命令会取消设置除少数环境变量之外的所有变量,以最大程度地保证其随后执行的命令的行为的一致性。您可以使用 /etc/sudoers 文件中的配置键“env_keep”来指示它将 HISTFILE 添加到它保留的变量列表中。这样做的效果是,不仅 root 用户,而且任何您使用 sudo 进入的用户sudo -u <someone_else>
。sudo sed --in-place '/^Defaults\s+env_keep=/s/"$/ HISTFILE"/' /etc/sudoers
更改系统的默认环境变量
通过在 /etc/environment 中定义 HISTFILE 变量,您可以比使用
sudo
或时更频繁地获得统一的 shell 历史记录su
。例如,此方法还适用于 TTY,例如使用 ++ ... 全局快捷键时遇到的 TTY,或Ctrl通过选择GRUB 的恢复模式选项进入的 TTY。AltF2F6systemctl --user show-environment | grep HISTFILE | sudo tee -a /etc/environment
仅在需要时访问用户 shell 历史记录
如果您希望仅在逐案情况下激活此行为而不是永久更改任何配置,则该问题的一个临时解决方案是在这些特定
sudo
调用前面加上HISTFILE=$HISTFILE
。HISTFILE=$(printenv HISTFILE) sudo su
注意:以上示例假设您的安装中有 systemd。如果没有,几乎总是可以用以下方法替代 printenv
或者 env
为了 systemctl --user show-environment
。这 systemctl
选择该方法是为了演示目的,以尽量减少从当前正在使用的 shell 实例传播 HISTFILE 非默认值的可能性。