如何在通过 ssh 重启/停止时注销用户,但同时保存他们的 .bash_history?

如何在通过 ssh 重启/停止时注销用户,但同时保存他们的 .bash_history?

当我通过 SSH 重新启动服务器时,会话会挂起,而不是很好地将我注销,以便我可以继续使用当前终端。我尝试了以下方法来解决这个问题:https://bbs.archlinux.org/viewtopic.php?id=50089 但是我的 bash 历史记录在重启之前没有被保存。

有没有办法在重启/停止命令之前很好地注销所有用户(以便保存他们的 bash 历史记录)?即在重启/停止之前保存 bash 历史记录和结束用户会话?

操作系统:Ubuntu Server 11.04

答案1

您需要history -a在每个用户会话中执行类似操作。我想不出一个“好”的方法来做到这一点,但在 bash 中使用 PROMPT_COMMAND 是可行的,PROMPT_COMMAND 是每次 bash 返回提示时执行的命令的环境变量,即它会自动在每次执行命令时将历史记录刷新到 .bash_history。有效但可能不是最好的解决方案。将其放在.bashrc或 profile.d 文件中(如果您使用的是与 profile.d 兼容的发行版)。

导出 PROMPT_COMMAND='history -a'

答案2

我找到了一个解决方案:

我只需要使用“killall -u”而不是“skill -KILL -u”。:) 如下所示:http://www.cyberciti.biz/tips/howto-linux-kill-and-logout-users.html,命令“skill”似乎已经过时了,应该使用其他命令如 pkill 和 killall。pkill 没有做我想要的事情,但 killall 做到了。:)

以下是完整的解决方案:

1)创建一个脚本/etc/init.d/killusers,包含以下内容:

#!/bin/bash
#
# chkconfig: 35 90 12
# description: Foo server
#

# Get function from functions library
#. /etc/init.d/functions
. /lib/lsb/init-functions

# Start the service FOO
start() {
        #initlog -c "echo -n Starting FOO server: "
        #who | cut -d " " -f1 | uniq | xargs killall -u
        #who | cut -d " " -f1 | uniq | xargs skill -KILL -u
        #success $"FOO server startup"
        echo "Do nothing"
}

# Restart the service FOO
stop() {
        #initlog -c "echo -n Stopping FOO server: "
        who | cut -d " " -f1 | uniq | xargs killall -u
        #who | cut -d " " -f1 | uniq | xargs skill -KILL -u
        #who | cut -d " " -f1 | uniq | xargs pkill -STOP -u
}

### main logic ###
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        status FOO
        ;;
  restart|reload|condrestart)
        stop
        start
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|reload|status}"
        exit 1
esac

exit 0

(脚本基于http://www.cyberciti.biz/tips/linux-write-sys-v-init-script-to-start-stop-service.html

2)使其可执行:

sudo chmod +x /etc/init.d/killusers

3)将其添加到关机脚本中:

sudo update-rc.d killusers defaults

注 1:我认为运行级别 6 应该足够了,但是为了确保万无一失,我选择了默认级别。如果脚本只是在关机期间运行,那么它可能也只包含 kill 命令。

注2:要立即保存 bash 历史记录,您可以使用(感谢 HampusLi):

history -a

因此你也可以直接运行:

history -a && sudo reboot

但我希望它适用于任何用户,而无需创建别名、脚本或类似的东西。

相关内容