【问题标题】:Unset or remove most recent like of .bash_history from within Python script从 Python 脚本中取消设置或删除最近的 .bash_history
【发布时间】:2016-07-06 17:31:15
【问题描述】:

问题

我有一个 Python 脚本,当我从命令行运行它时,我不想在 .bash_history 中记录任何内容。

原因是脚本使用了 Python argparse 库,它允许我直接从命令行将参数传递给 Python 代码。

例如,我可以编写脚本,使其在脚本中使用“123456”作为值:

$ ./scriptname.py -n 123456

问题是我不希望将值 123456 存储在 .bash_history 中。事实上,我宁愿整个命令一开始就不要存储到 .bash_history 文件中。

我的尝试

  1. 子进程和历史 -c

我已将子进程库添加到我的脚本顶部,然后在尝试主动清除我正在使用的 shell 的当前历史记录之后直接包含它:

subprocess.call("history -c", shell=True)

理论上,这应该清除当前 shell 的历史记录。我没有从中看到错误,所以我假设它在其他一些 shell 中运行。当我在脚本之外运行它时(直接在运行命令来调用脚本之后)它可以正常工作。

  1. 子进程和取消设置 HISTFILE

我也使用了以下子进程但没有成功:

subprocess.call("unset HISTFILE", shell=True)
  1. os.system & 历史 -c

我还使用了 Python 的 os 库,并在脚本中包含以下内容:

os.system("history -c")
  1. os.system 并取消设置 HISTFILE

我也尝试使用 os.system 取消设置 HISTFILE 无济于事。

os.system("unset HISTFILE")

首选解决方案特征

我意识到我可以在使用命令后简单地输入 unset HISTFILE 或 history -c。但我希望这尽可能是一个独立的脚本。

理想情况下,该解决方案会阻止 ./scomescript.py 命令被记录在 .bash_history 中。

我需要这个脚本根据输入将文本输出到终端,因此我也不能立即关闭终端。

我想必须有一种方法可以从 python 脚本本身执行此操作 - 这是我的偏好。

【问题讨论】:

  • 我在某处听说如果在 bash 命令前加一个空格,它将不会被保存。这对我不起作用,但这是我所听到的。
  • 感谢 zondo,不幸的是我认为这需要一个特殊的环境变量设置。见:stackoverflow.com/questions/8473121/…
  • 好吧,感谢您澄清这一点。很遗憾,真正提出问题的人没有得到答案,但我是;/
  • 这是因为参数是秘密,例如密码吗?

标签: python linux macos bash shell


【解决方案1】:

这确实不太可行...将条目添加到历史文件是由交互式 shell 执行的,它发生在命令完成并且父 shell 退出之后。 ,严格来说,是可能的,如果你要让你的 python 程序执行生成一个 hacky 后台进程,它会在循环中读取历史文件并重写它。我真的不能提倡这样的事情,但你可以在你的脚本中附加如下内容:

os.system("nohup bash -ic 'while :; do read -d \"\" history < \"$HISTFILE\"; echo \"$history\" | sed -e\"s@^%s.*@@\" -e\"/^$/d\" > \"$HISTFILE\"; sleep 1; done &' >/dev/null 2>&1" % sys.argv[0])

我认为实现不记录任何参数目标的更好方法是使用var = raw_input("") 之类的东西,而不是在命令行上传递敏感参数。

您也可以创建一个 shell 函数来包装您的脚本,例如 my_script(){ set +o history; python_script.py "$@; set -o history ;}?

【讨论】:

  • 历史记录是在 shell 关闭后而不是在命令完成后记录的。在我的测试中,我验证了这一点。因此,如果我的脚本能够在同一个 shell 中正确运行 unset HISTORY,这不应该按照我的意图工作吗?感谢您提供替代解决方案。我会考虑使用它作为备份。
  • 对不起,你对历史file的说法是正确的,我的意思是在命令完成后将其添加到history中;我会编辑答案。最终,问题在于子进程无法对父 shell 的环境进行持久更改;从 python 程序中修改历史文件的唯一方法是使用后台任务。为了完整起见,我将添加几个示例来说明我的意思。
  • 啊。该死。我明白你在说什么。从理论上讲,history -c 会起作用,除了我根本无法在父 shell 中进行任何更改。那好吧。挫败。我会尝试你的一种选择。谢谢杰夫。
猜你喜欢
  • 1970-01-01
  • 2011-01-16
  • 2010-09-12
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 2014-11-28
  • 2011-11-03
  • 2014-11-29
相关资源
最近更新 更多