Python os.system() - 它会留下历史记录吗(bash_history等)?
我在我的Ubuntu电脑上使用os.system()
来运行一些openssl命令。我把密码直接写在命令里,像这样:
//python code
os.system("openssl enc -aes-256-cbc ... -k password")
我想知道,这个命令是否会被记录在某个shell或bash的历史文件里(就像我直接在终端输入这个命令时那样)。所以,简单来说,我是在问这样处理密码是否安全。
3 个回答
不,bash只记录那些你在命令行里手动输入的命令。
通过 os.system
执行的命令是不会被记录下来的。
虽然命令的参数不会被记录(只有交互式命令会被记录,而且这些记录会保存在你家目录下的一个文件中,并且这个文件的权限设置是正确的),但是在传递密码时仍然存在真实的风险。命令行参数和环境变量对使用 ps
命令的所有用户都是可见的,只要他们使用了正确的选项。不同操作系统的具体选项有所不同,所以你需要查看本地的文档(在OSX上,使用 ps -wwaxE
可以看到这些信息)。
安全地传递密码的方法有两种:一种是通过管道和 openssl 的 -pass stdin
选项(-k
选项是不安全且过时的);另一种是通过一个权限设置得当的文件和 -pass file:pathname
选项(当然,pathname
要替换成文件的名字)。你也可以使用 -pass fd:number
,但我不太清楚这和 os.system
配合起来是否容易。以上这些方法都是安全的(可能需要小心处理),因为你无法直接查看管道的内容,而且可以妥善保护文件系统。
当然,一旦你采取了这些步骤来确保安全地调用 openssl,那么它是否被记录就不重要了;无论如何,它都会是安全的。
不,这样做并不安全。不过在多用户的系统上,通过命令行参数传递密码被认为是不安全的,因为其他用户理论上可以通过“ps”等命令看到这些密码。
通过文件描述符(比如标准输入)或者环境变量传递密码就不会受到这种攻击;大多数程序都支持这些方法。如果你对此感到不安,可以考虑使用这些方式。