我有一个脚本,它在其内部启动一个带有秘密参数的命令。例如:
#!/bin/bash
command-name secret
运行命令时我可以通读ps -ef | grep command-name
这就是秘密。
有没有什么方法可以隐藏这个秘密ps -ef
,命令行参数被混淆了?
首先,您不能隐藏命令行参数。其他用户仍然可以通过以下方式看到它们ps aux
and cat /proc/$YOUR_PROCESS_PID/cmdline
在启动程序时(在程序有机会对参数进行运行时更改之前)。好消息是,您仍然可以通过使用替代方案来保守秘密:
-
使用标准输入:
mySecret='hello-neo' printenv mySecret | myCommand
-
如果您想将秘密与主脚本分离,请使用专用文件(请注意,建议您使用全盘加密并确保文件具有正确的chmod
权限):
cat /my/secret | myCommand
-
使用环境变量(有警告 https://security.stackexchange.com/questions/197784/is-it-unsafe-to-use-environmental-variables-for-secret-data)。如果您的程序可以读取它们,请执行以下操作:
mySecret='hello-neo' myCommand
-
使用临时文件描述符:
myCommand <( mySecret='hello-neo' printenv mySecret )
在最后一种情况下,您的程序将像这样启动myCommand /dev/fd/67
,其中的内容/dev/fd/67
是你的秘密(hello-neo
在此示例中)。
在上述所有方法中,请小心不要将命令保留在 bash 命令历史记录中(~/.bash_history
)。您可以通过从脚本(文件)运行命令或每次以交互方式提示自己输入密码来避免这种情况:
read -s secret
s=$secret printenv s | myCommand # approach 2
myCommand <( s=$secret printenv s ) # approach 3
secret=$secret myCommand # approach 4
export secret && myCommand # another variation of approach 4
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)