如何获取不受用户或权限影响的综合系统历史记录?

如何获取不受用户或权限影响的综合系统历史记录?

如果我是一个普通用户并且我输入

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。AltF2F6

    systemctl --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 非默认值的可能性

相关内容