我有这个文件,用于在导出值之前设置用户名和密码。
#!/bin/bash
echo -n "User:";
read user
echo -n "Password:";
read -s password
export http_proxy=http://$user:$password@$domain:$portnum
if curl -silent http://www.google.com | grep authentication_failed;
then
echo NO CONNECT
unset http_proxy
else
echo OK
fi
在history
, printenv
, 中,export -p
我可以看到我设置的值
此外,我想要在 $password 中使用加密形式的密码,而不是逐字包含我的密码的值。
我熟悉使用 openssh 来加盐密码,或使用 perl 的 crypt() 打印哈希,但就我的目的而言,我看不到它的用法?有什么建议吗?
答案1
我无法重现您提到的问题,密码显示在history
命令的输出中。
密码显示在 和 的输出中,printenv
并且export -p
按预期工作。这些命令显示环境变量,这就是您放置字符串的位置http_proxy
。
环境变量会自动由子进程继承,但不会由任何其他进程继承。我不明白为什么您认为这是一个主要问题,因为它仅对同一安全域内的进程可见。
但是您可以停止将其放入环境变量中,而是使用普通的 shell 变量。那么它就不会被子进程继承。由于您可能希望curl 能够访问环境变量,因此您可以将环境变量仅传递给该命令而不是所有其他命令。
#!/bin/bash
echo -n "User:";
read user
echo -n "Password:";
read -s password
proxy="http://$user:$password@$domain:$portnum"
if http_proxy="$proxy" curl -silent http://www.google.com | grep authentication_failed;
then
echo NO CONNECT
else
echo OK
fi
答案2
如果您要传递敏感信息并经常使用它,您可能最好使用 openssl 对其进行加密
把类似的东西
#create key as follows - will prompt for password
#echo -n 'secret you want encrypted' | openssl enc -aes-256-cbc -a -salt -pbkdf2|base64
export MY_SECRET='VTJGc2RHVmtYMTlzVnBGWXNYUitLWlpYT3BWdStaQXJXeUVwc1JORnFsNWswZXJKT1dkRWpsWkxLWVFnK1hONQo='
进入您的 .bashrc 将为您提供一个加密的环境变量,您可以在需要机密的任何地方访问该变量,并且系统将提示您输入创建环境变量时使用的密码。
在上面的例子中它是“秘密”
您访问它的命令如下
`echo $MY_SECRET|base64 --decode|openssl enc -aes-256-cbc -a -d -salt -pbkdf2 `
例如
xfreerpd /parameters.... /p:`echo $MY_SECRET|base64 --decode|openssl enc -aes-256-cbc -a -d -salt -pbkdf2`
对于您正在创建环境变量并将密码内置到环境变量中的查询
您可以按如下方式创建变量
password_encrypted=`echo -n 'secret you want encrypted' | openssl enc -aes-256-cbc -a -salt -pbkdf2|base64`
然后使用如下
export http_proxy=http://$user:`echo $password_encrypted|base64 --decode|openssl enc -aes-256-cbc -a -d -salt -pbkdf2 `@$domain:$portnum
base64部分是为了让你可以设置变量
MY_SECRET='VTJGc2RHVmtYMTlzVnBGWXNYUitLWlpYT3BWdStaQXJXeUVwc1JORnFsNWswZXJKT1dkRWpsWkxLWVFnK1hONQo='
并且不要将您的秘密困在命令历史记录等中。
当您生成秘密时,有时 Base64 输出将有多行,因此您需要为变量进行换行。
echo -n 'secret you want encrypted' | openssl enc -aes-256-cbc -a -salt -pbkdf2|base64
enter aes-256-cbc encryption password:
Verifying - enter aes-256-cbc encryption password:
VTJGc2RHVmtYMTlzVnBGWXNYUitLWlpYT3BWdStaQXJXeUVwc1JORnFsNWswZXJKT1dkRWpsWkxL
WVFnK1hONQo=
#take the above line break out
MY_SECRET='VTJGc2RHVmtYMTlzVnBGWXNYUitLWlpYT3BWdStaQXJXeUVwc1JORnFsNWswZXJKT1dkRWpsWkxLWVFnK1hONQo='
openssh 每次都会提示您输入密码来加密和解密,您可以提供一个密码作为命令的一部分,但这样您就只是从历史记录中隐藏了一些内容等。看看https://www.howtoing.com/generate-encrypt-decrypt-random-passwords-in-linux/有关使用 openssh 执行此操作的一些信息。https://www.serverlab.ca/tutorials/linux/administration-linux/how-to-base64-encode-and-decode-from-command-line/对于 Base64 和https://stackoverflow.com/questions/16072351/how-to-assign-an-output-to-a-shellscript-variable对于命令替换的不同选项,我在上面使用了反勾号 `
PS 添加一个功能,例如
get-key()
{
echo -n "$1"|base64 --decode|openssl enc -aes-256-cbc -a -d -salt -pbkdf2
}
如果您需要的话,您的 bashrc 可以让您快速访问秘密
答案3
您应该将 paasword 存储在仅当前用户可读的安全文件中。
然后通过管道输入该文件内容或使用目标应用程序提供的机制。
恕我直言,它本身curl
就提供了这样的选项。