gpt4 book ai didi

bash - 非交互式 shell 命令的历史

转载 作者:行者123 更新时间:2023-11-29 09:32:09 25 4
gpt4 key购买 nike

我一直在寻找一种方法来记录有关命令历史的一些更详细的信息。我的主要目的是获得一个粗略的命令日志,以便在调试我们的应用程序问题时构建粗略的服务器时间线。 它不是用于高度详细的审计目的。我遇到了 this post它提出了一种极好的修改 PROMPT_COMMAND 的方法,以使用有关每个命令的附加信息来扩充 history 日志。它建议将以下内容添加到 ~/.bashrc 文件中:

export PROMPT_COMMAND='hpwd=$(history 1); hpwd="${hpwd# *[0-9]*  }"; if [[ ${hpwd%% *} == "cd" ]]; then cwd=$OLDPWD; else cwd=$PWD; fi; hpwd="${hpwd% ### *} ### $cwd"; history -s "$hpwd"'

这很棒,只是它只在发出 PS1 提示时发生。有没有办法增强它以使用非交互式 shell(我认为这是正确的术语)?

例如,我想:

ssh host "ls | grep home"

ls 创建条目 |也在 host 上执行 grep home,但由于这不是通过 PS1 提示完成的,因此链接的解决方案不够完善。

我稍微研究了一下 auditd。这是一个很棒的实用程序,但详细程度超出了我的需要。我本可以很容易地解析日志,但是管道、重定向、循环变成了一场噩梦,要理智地重建成类似于 history 已经报告的东西。

最佳答案

围绕 ssh 的简单包装器似乎是实现此目的的直接方法。

shout () {
local host
host=$1
shift
ssh "$host" <<____HERE
echo "$@" >>\$HOME/.shout-history
bash -c "$@"
____HERE
}

或者如果您希望包装器在本地运行,

shout () {
local host
host=$1
shift
echo "$@" >>$HOME/.shout-history
ssh "$host" "$@"
}

我称此 shoutssh 相对应,你知道,它应该是安静的。另见 this .当然,如果您是管理员,您可以简单地将 /usr/bin/ssh 移动到某个不起眼的地方并强制您的用户运行 /usr/local/bin/ssh与上述类似的内容。知识渊博的用户很容易绕过它,但如果你真的很严厉,有办法让它更难。

如果您是远程主机的管理员,您可以强制所有用户运行 /usr/local/bin/shout 作为他们的 shell,例如,并用或多或少的东西填充它类似。

#!/bin/bash
echo "$@" >>/home/root/im.in.ur.sh.reading.ur.seekrit.cmds.lol
exec /bin/bash -c "$@"

只要确保转录文件是全局可写但不是全局可读的。

关于bash - 非交互式 shell 命令的历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14204556/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com