【问题标题】:Execute a command without keeping it in history [closed]执行命令而不将其保留在历史记录中[关闭]
【发布时间】:2012-01-18 09:02:05
【问题描述】:

我想执行一些命令,但我不想将它们存储在命令历史记录中。这样任何人都无法在.bash_history 文件中搜索它们。

有没有办法以这种方式执行 Bash 命令?

【问题讨论】:

  • 这个问题可能应该转移到 ServerFault,因为这不是“编程”,而是“服务器管理员” - 但感谢您的问题/答案,正是我所需要的!

标签: linux bash unix


【解决方案1】:

以空格开始您的命令,它不会包含在历史记录中。

请注意,这确实需要设置环境变量 $HISTCONTROL

  • 检查以下命令是否返回 ignorespaceignoreboth:

     echo $HISTCONTROL
    
  • 如果缺少环境变量,要添加环境变量,可以在 Bash 配置文件中添加以下行。例如,归档%HOME/.bashrc

     export HISTCONTROL=ignorespace
    

sourcing 再次配置后,空格前缀的命令将不会写入$HISTFILE

【讨论】:

  • 这不起作用,除非在 $HISTCONTROL 中包含 ignorespace - 尽管这可能是大多数系统的默认设置。
  • 正确。有关更多详细信息,OP 应该查看 bash 手册页中的 HISTCONTROL 和 HISTIGNORE。
  • thegeekstuff.com/2008/08/… - 此处提供了更多 bash 历史提示,包括这种从历史中隐藏命令的方法
【解决方案2】:

在任何给定的 Bash 会话中,通过键入以下内容将历史文件设置为 /dev/null:

export HISTFILE=/dev/null

请注意,正如 cmets 中所指出的,这不会将该会话中的任何命令写入历史记录!

请不要打扰系统管理员的辛勤工作;)

Doodad's solution 更优雅。只需取消设置变量:unset HISTFILE(谢谢!)

【讨论】:

  • 这将阻止 all 命令被记录。这不是提问者想要的。
  • 这给我带来了与注销时/dev/null 权限设置为 0600 相关的问题。相反,我使用了unset HISTFILE
【解决方案3】:
echo "discreet";history -d $(history 1)

【讨论】:

  • 哦,按命令控制?不错。
  • 这在zsh 中不起作用。它输出fc: too many arguments 并将命令存储在历史记录中。
【解决方案4】:

John Doe'sCédric ROYER's answer 的扩展。但是,这似乎对我有用。

<your_secret_command>; history -d $((HISTCMD-1))

您不应该在历史记录中看到该命令的条目。

这里是解释...

'history -d' 从历史记录中删除提到的条目。

HISTCMD 存储下一个要执行的命令号。所以,(HISTCMD-1) 指的是最后执行的命令。

Remove a certain line from Bash history file

【讨论】:

    【解决方案5】:

    如果您使用的是Z shell (zsh),您可以运行:

    setopt histignorespace
    

    设置后,每个以空格开头的命令都会从历史记录中排除。

    您可以在.zshrc 中使用别名开启/关闭

    # Toggle ignore-space. Useful when entering passwords.
    alias history-ignore-space-on='\
    setopt hist_ignore_space;\
    echo "Commands starting with space are now EXCLUDED from history."'
    
    alias history-ignore-space-off='\
    unsetopt hist_ignore_space;\
    echo "Commands starting with space are now ADDED to history."'
    

    【讨论】:

      【解决方案6】:

      您可能会考虑使用没有历史记录的 shell,例如

      /bin/sh << END
         your commands without history
      END
      

      (也许/bin/dash/bin/sash 可能比/bin/sh 更合适)

      或者更好的是,使用batch 实用程序,例如,

      batch << EOB
         your commands
      EOB
      

      然后历史记录将包含shbatch,这不是很有意义。

      【讨论】:

        【解决方案7】:

        你可以开始你的会话

        export HISTFILE=/dev/null ;history -d $(history 1)
        

        然后继续你的偷偷摸摸的行为。将 histfile 设置为 /dev/null 将被记录到历史文件中,但该条目将很容易被删除,并且不会显示任何痕迹(至少在历史文件中)。

        另外,这是非永久性的。

        【讨论】:

        • 这已经回答了很多次了。你会说你的回答对这个帖子有什么好处(除了无用的噪音)?
        • 它没有放在一个答案中,以免命令本身出现在历史记录中并且没有任何显示之后输入。
        • 但是现在这个帖子真是一团糟!在这种情况下,尤其是对于这样一个老问题,我认为最好编辑已经存在的好答案,和/或发表评论……
        【解决方案8】:

        正如提到的by Doodad in commentsunset HISTFILE 做得很好,但如果您还想删除一些历史记录,请使用echo $HISTFILE 获取历史记录文件位置(通常为~/.bash_history)、unset HISTFILE 和编辑~/.bash_history(或任何HISTFILE ——当然现在是unset,所以你无法阅读)。

        $ echo $HISTFILE       # E.g. ~/.bash_history
        $ unset HISTFILE
        $ vi ~/.bash_history   # Or your preferred editor
        

        那么你已经编辑了你的历史,以及你编辑它的事实!

        【讨论】:

        • 试过这个:GNU bash,版本 3.2.57(1)-release (x86_64-apple-darwin15),但它不起作用。我在 unset HISTORY 后使用的命令存储在 ~/.bash_history
        • @Krystian 我的错误——我写了“unset HISTORY”,而它应该是“unset HISTFILE”——更正了。它现在有效吗?它适用于 GNU bash,版本 4.3.30(1)-release (x86_64-pc-linux-gnu)。
        • 好吧,我不确定。简单的测试:unset HISTFILE; echo TEST; history 会给你命令echo TEST 就像从前到最后一样。虽然终止会话并再次连接后,历史确实没有这个条目。所以我会说它有效:)
        • unset HISTFILE 似乎不会停止将命令记录在内存中的历史记录中,但它确实会停止将它们记录在 $HISTFILE 所在的任何文件中。所以我猜你的内存中仍然有你的本地历史,但它不再被记录在文件中,这可能是你想要的! ;)
        【解决方案9】:

        您也可以使用以下命令:

        echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')
        

        我认为这是一个非常便携的命令。

        【讨论】:

        • 我已经创建了别名:alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')" 现在你可以这样做:mysql -uroot -pSecretPassword ; forget
        • 对不起,但我意识到您需要创建函数而不是别名,因为引号会更改 $s 的含义以及 sed 中的其他内容。 function forget() { // put code here // }
        【解决方案10】:

        有几种方法可以实现这一目标。这会将历史文件的大小设置为 0:

        export HISTFILESIZE=0
        

        这会将历史文件设置为/dev/null,从而有效地禁用它:

        export HISTFILE=/dev/null
        

        对于单个命令,您可以在命令前加上空格,它不会保存在历史文件中。请注意,这要求您将 ignorespace 值包含在 $HISTCONTROL 环境变量中(man bash 并搜索 ignorespace 以获取更多详细信息)。

        【讨论】:

        • 这将阻止 all 命令被记录。这不是提问者想要的。
        • 好吧,我有点假设提问者会在做了他想做的任何不应该记录的事情后重置值。
        【解决方案11】:

        你只需要运行:
        $ set +o history

        要查看更多信息,请运行:
        $ man set

        【讨论】:

        • 这会禁用所有未来命令的历史记录,而不是单个命令。大多数来这里的人应该看看接受的答案。
        • 这是有效的,或者可以但不完整。只要我们后面加上反向命令set -x history就可以了。
        【解决方案12】:

        如果您想清除所有历史记录,这很方便,包括您已清除所有历史记录的事实!

        rm .bash_history;export HISTFILE=/dev/null;exit
        

        【讨论】:

          【解决方案13】:

          这个命令可能会派上用场。这不会记录执行的命令

          history -d $((HISTCMD-1)) && <Your Command Here>
          

          【讨论】:

            猜你喜欢
            • 2020-02-22
            • 1970-01-01
            • 1970-01-01
            • 2021-02-10
            • 2014-09-02
            • 2020-10-31
            • 1970-01-01
            • 2018-01-30
            • 2020-08-28
            相关资源
            最近更新 更多