从执行 bash 脚本中清除历史记录中的最后一个 bash 命令

Posted

技术标签:

【中文标题】从执行 bash 脚本中清除历史记录中的最后一个 bash 命令【英文标题】:Clear last bash command from history from executing bash script 【发布时间】:2021-11-27 12:58:31 【问题描述】:

我有一个 bash 脚本,它使用 expect 包到 ssh 到远程服务器中。

我的脚本如下所示:

#!/bin/bash

while getopts "p:" option; do
   case "$option" in
      p) PASSWORD=$OPTARG;;
   esac
done

/usr/bin/expect -c "

spawn ssh my.login.server.com
expect 
   \"Password*\"  
     send \"$PASSWORD\r\" 
   
 
interact
"

我像 ./login.sh -p <my-confidential-password>

一样运行它

现在,一旦你运行它并成功登录并从远程服务器退出,我可以从键盘上点击up-arrow-key,并且仍然可以在终端中看到我的带有密码的命令。或者我只是运行history 它会出现。一旦我退出终端,它也会出现在bash_history

我需要在我的脚本中添加一些可以从历史记录中清除它并且不留下我在任何地方运行的命令(或密码)的痕迹。

我试过了:

使用history -c && history -r 清除它,这不起作用,因为脚本会创建自己的会话。 另外,echo $HISTCMD 在脚本中返回 1,因此我无法使用 history -d <tag> 清除。

附:我正在使用 macOS

【问题讨论】:

【参考方案1】:

您可以禁用命令的命令历史记录:

set +o history
echo "$PASSWORD"
set -o history

或者,如果你的HISTCONTROL Bash 变量包含ignorespace,你可以用空格缩进命令,它不会被添加到历史记录中:

$ HISTCONTROL=ignorespace
$ echo "Hi"
Hi
$  echo "Invisible"  # Extra leading space!
Invisible
$ history | tail -n2
    7  echo "Hi"
    8  history | tail -n2

请注意,这也不安全:密码在任何显示正在运行的进程的地方仍然可见(例如top 和朋友)。考虑从具有400 权限的文件中读取它,或者使用类似pass 的文件。

您还可以将调用包装到提示输入密码的辅助函数中,这样包含密码的调用就不会进入命令历史记录:

runwithpw() 
    IFS= read -rp 'Password: ' pass
    ./login.sh -p "$pass"

【讨论】:

以上是关于从执行 bash 脚本中清除历史记录中的最后一个 bash 命令的主要内容,如果未能解决你的问题,请参考以下文章

sh 用于从repo历史记录中删除所有PSD文件的Bash脚本。

如何来清除Linux操作系统命令的历史记录

不留痕迹的清除部分history历史命令记录(转)

linux怎么清除history记录

如何使用Linux清除用户登录记录和命令历史

清除Eclipse中的内置浏览器中的历史记录