【问题标题】:Clear last bash command from history from executing bash script从执行 bash 脚本中清除历史记录中的最后一个 bash 命令
【发布时间】: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

【问题讨论】:

    标签: bash macos terminal expect password-protection


    【解决方案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"
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-25
      • 1970-01-01
      • 2021-11-14
      • 2020-02-22
      • 1970-01-01
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      相关资源
      最近更新 更多