如何将 bash 变量传递给 php 函数,而不会显示未定义的变量错误消息



我正在生成一个密码哈希,我想基于用户输入,以便稍后在脚本中使用。我已经尝试了以下 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';"

相关内容

  • 没有找到相关文章

最新更新