我正在生成一个密码哈希,我想基于用户输入,以便稍后在脚本中使用。我已经尝试了以下 bash 变量语法的变体:
#!/bin/bash
printf "Enter password:"
read pw
php -r 'echo password_hash("$pw", PASSWORD_DEFAULT, [ "cost" => 11 ]) . "n";'
我得到了正确的哈希值,但只有在收到未定义的变量警告之后。
当我将变量放在单引号"$pw"中,然后将密码输入为"密码"或"密码"时,我没有收到错误。
如何将 bash 变量传递给 php 命令或以其他方式将其分配给 bash 脚本中的 php 变量,而没有未定义的变量错误消息?
通过环境传递变量是要走的路(因为与通过 php 的命令行传递密码相比,密码永远不会被不必要的进程或用户访问
(。这应该使用内置的 POSIX 合规性export
来完成。或者,也可以使用仅限 Bash declare -x
。
printf "Enter password:"
read pw
# export pw to the environment:
export pw
# the process executing your php program reads pw from the
# environment that it inherited from its parent process:
php -r 'echo password_hash($_SERVER["pw"], PASSWORD_DEFAULT, [ "cost" => 11 ]) . "n";'
请注意,超全局数组的填充取决于 PHP 配置中的 variables_order
值(S
字符必须位于此设置的值中才能填充$_SERVER
(。
php -r 'echo password_hash("$pw", PASSWORD_DEFAULT, [ "cost" => 11 ]) . "n";'
Bash 中的单引号字符串不执行变量扩展,因此您实际上是将字符串$pw
传递给 PHP 进行分析,并且由于它不存在,因此您会收到来自 PHP 的警告。您返回的哈希可能是空字符串,而不是您想要的字符串。尝试将脚本中的php -r
替换为echo
,以准确查看传递给php
的内容。
出于安全原因,export
变量的建议是一个不错的选择(尽管您应该使用 $_ENV
,而不是 $_SERVER
(,但在一般情况下(即不是密码(,这不是必需的。正确引用字符串以便在 Bash 中计算变量很容易,一旦您理解了 Bash 的引用语义(诚然,这可能会令人困惑(。
对于这种情况,只需反转字符串中的单引号和双引号就足够了:
php -r "echo password_hash('$pw', PASSWORD_DEFAULT, [ 'cost' => 11 ]) . 'n';"