curl
我有一个执行多次的脚本。
我只想输入密码一次(所以我不希望curl 在每次执行时都要求输入密码)。我不希望密码出现在进程列表或文件描述符或其他内容中。
#!/bin/bash
read -p "Enter pw:" -s pw
provide_pw() {
cat << END
"$pw"
END
}
for i in {1..10}; do
curl -u $(logname):$(provide_pw) "$url"
done
这种方法安全吗?如果我这样做,其他用户是否有可能获取我的密码?
答案1
对于所有与 read 、 cat 和 heredocs 相关的操作,最终命令替换将导致$(provide_pw)
被实际密码替换。然后它将成为流程细节的一部分。
从man curl
, 关于-u
:
在它工作的系统上,curl 将从进程列表中隐藏给定的选项参数。
因此,在此类系统上,以及在适当设置的 Linux 系统上,密码将对其他用户隐藏,但在其他地方,每个人都可以通过使用、等hidepid
查看curl 进程的命令行来查看密码。ps
top
如果您愿意read
密码,请curl
为您做:
如果您仅指定用户名,curl 将提示输入密码。
另请参阅:curl 如何保护密码不出现在 ps 输出中?这里有一个竞争条件:在curl启动和清理命令行之间,密码将是可见的,并且如果它没有通过其他方式隐藏(如hidepid
在Linux上),则在该窗口中每个人都可以看到密码。
答案2
将密码放入curl
命令行参数中是很常见的。它可能不是使用密码的最安全方法,但没有什么是完美的,并且在大多数情况下没有太多或任何其他选择。
不过,您获取密码的功能是完全没有必要的。你可以简单地这样做:
read -rsp "Enter pw: " pw
curl -u "$(logname)":"$pw" "$url"
注意:我已将-r
参数添加到您的read
命令中,因为它将允许您从字面上读取反斜杠转义字符,您肯定希望能够对密码执行此操作。