Windows &引用;历史-c“;不';在脚本中调用时无法工作?

Windows &引用;历史-c“;不';在脚本中调用时无法工作?,windows,bash,git-bash,mingw-w64,Windows,Bash,Git Bash,Mingw W64,我编写了一个bash脚本来调用一个Python脚本,该脚本使用AES加密私有数据,将文件路径和256位密码作为唯一的参数。加密完成后,它会清除历史记录,这样密码就不会出现在那里,以防我让终端打开。它看起来像这样: #/bin/bash python.py“$1”“$2” 历史-c echo”“>~/.bash\u历史记录 ~/.bash_history文件被很好地清除,但是如果在运行此脚本之后运行history,则我的所有历史记录仍然存在(直到我退出终端)。这里有什么我遗漏的吗?不要试图清除历

我编写了一个bash脚本来调用一个Python脚本,该脚本使用AES加密私有数据,将文件路径和256位密码作为唯一的参数。加密完成后,它会清除历史记录,这样密码就不会出现在那里,以防我让终端打开。它看起来像这样:

#/bin/bash
python.py“$1”“$2”
历史-c
echo”“>~/.bash\u历史记录

~/.bash_history
文件被很好地清除,但是如果在运行此脚本之后运行
history
,则我的所有历史记录仍然存在(直到我退出终端)。这里有什么我遗漏的吗?

不要试图清除历史记录——即使这是在命令行上传递密码会暴露它的最明显的方式,但这一操作给人一种错误的安全感:在命令行上给出的密码很容易通过在同一台机器上运行的其他进程捕获(即使在不可信的账户下!)即使没有任何历史记录

此外,正如您所注意到的,shell只能修改自己的内存中状态,而不能修改启动它的单独进程的内存中状态(它甚至可能不是同一个shell,或者根本不是shell!)


相反,请修改Python程序的调用约定,以便直接从TTY(如SSH)或环境中读取密码

# assumes you renamed aesencrypt.py to aesencrypt, ran chmod +x, and gave a valid shebang
password="somePassword" aesencrypt outFile
…并且您希望修改Python脚本以执行以下操作:

!/usr/bin/env python
导入操作系统,系统
filename=sys.argv[1]
password=os.environ['password']
#…把剩下的逻辑放在这里。

不要试图清除历史记录——即使这是在命令行上传递密码会暴露历史记录的最明显方式,但这一操作给人一种错误的安全感:在命令行上给出的密码很容易通过在同一台机器上运行的其他进程(即使是在不受信任的帐户下!)捕获甚至连历史都没有

此外,正如您所注意到的,shell只能修改自己的内存中状态,而不能修改启动它的单独进程的内存中状态(它甚至可能不是同一个shell,或者根本不是shell!)


相反,请修改Python程序的调用约定,以便直接从TTY(如SSH)或环境中读取密码

# assumes you renamed aesencrypt.py to aesencrypt, ran chmod +x, and gave a valid shebang
password="somePassword" aesencrypt outFile
…并且您希望修改Python脚本以执行以下操作:

!/usr/bin/env python
导入操作系统,系统
filename=sys.argv[1]
password=os.environ['password']
#…把剩下的逻辑放在这里。

当然不会——它会清除运行脚本的shell的历史记录,这与启动脚本的shell的历史记录不同。启动脚本的shell甚至不是bash——它可能是zsh或dash,也可能是由文件管理器或其他外部/C程序启动的,而这些外部/C程序甚至都不是ha我有“历史”的观念。无论如何,即使没有任何历史记录,在命令行上传递密码也是非常不安全的。任何同时运行的进程都可以从进程树中嗅出密码,并且存在专门用于记录和保留该历史记录的程序。直接从TTY读取密码——甚至stdin比命令行更安全;因此是一个环境变量。(我不知道Windows上的环境变量安全性,但在过去的十年或二十年中,Unix只对同一个用户帐户公开,而命令行程序参数对同一台机器上每个帐户下运行的每个程序都是可见的,除非您使用不同的进程名称空间)。当然,它不会清除运行脚本的shell的历史记录,这与启动脚本的shell的历史记录不同。启动脚本的shell甚至不是bash—它可能是zsh或dash,也可能是由文件管理器或其他没有“历史”观念。无论如何,即使没有任何历史记录,在命令行上传递密码也是非常不安全的。任何同时运行的进程都可以从进程树中嗅出密码,并且存在专门用于记录和保留该历史记录的程序。直接从TTY读取密码——甚至stdin比命令行更安全;因此是一个环境变量。(我不知道Windows上的环境变量安全性,但在过去的十年或二十年中,Unix只对同一个用户帐户公开,而命令行程序参数对同一台机器上每个帐户下运行的每个程序都是可见的,除非您使用不同的进程名称空间)。您能否解释一下,通过系统环境传递密码如何比直接在命令行传递密码更安全?即,我不确定如何
password=“hunter2”aesencrypt data.txt
比aesencrypt data.txt hunter2更安全。在这两种情况下,我都必须在完整命令中包含密码。@HurricaneFist,是的,它在命令的两种方式中都有,但是其他用户看不到环境变量,即使命令行参数是这样。请尝试从不同的角度查看
ps auxwww
nt帐户;您将只看到
aesencrypt data.txt
显示,没有
密码部分。(另外,如果您阅读bash手册,您会注意到有很多选项可用于抑制敏感命令的历史记录——如果您打开相应的标志,仅使用空格启动命令将使其脱离历史记录……但不会使其脱离
ps
)…如果您想了解一些人是如何做到这一点的,他们在满足一个天生不利于安全的常见请求的同时,非常努力地想做到最好,那么请查看
sshpass
的文档