通过 cat 将密码传递给curl 有多不安全

通过 cat 将密码传递给curl 有多不安全

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 进程的命令行来查看密码。pstop

如果您愿意read密码,请curl为您做:

如果您仅指定用户名,curl 将提示输入密码。

另请参阅:curl 如何保护密码不出现在 ps 输出中?这里有一个竞争条件:在curl启动和清理命令行之间,密码将是可见的,并且如果它没有通过其他方式隐藏(如hidepid在Linux上),则在该窗口中每个人都可以看到密码。

答案2

将密码放入curl命令行参数中是很常见的。它可能不是使用密码的最安全方法,但没有什么是完美的,并且在大多数情况下没有太多或任何其他选择。

不过,您获取密码的功能是完全没有必要的。你可以简单地这样做:

read -rsp "Enter pw: " pw
curl -u "$(logname)":"$pw" "$url"

注意:我已将-r参数添加到您的read命令中,因为它将允许您从字面上读取反斜杠转义字符,您肯定希望能够对密码执行此操作。

相关内容