如何在没有未定义的变量错误消息的情况下将bash变量传递给php函数?

时间:2017-05-25 16:28:59

标签: php bash shell

我正在生成一个密码哈希,我希望以用户输入为基础,以便稍后在脚本中使用。我在下面尝试了bash变量语法的变体:

#!/bin/bash

printf "Enter password:"
read pw

php -r 'echo password_hash("$pw", PASSWORD_DEFAULT, [ "cost" => 11 ]) . "\n";'

我得到正确的哈希值,但只有在得到未定义的变量警告后才会显示。

当我将变量放在单引号中时,$ pw'然后输入密码为"密码"或者密码'我没有收到错误。

如何在没有未定义变量错误消息的情况下将bash变量传递给php命令或以其他方式将其分配给bash脚本中的php变量?

2 个答案:

答案 0 :(得分:2)

通过环境传递变量是可行的方法(因为与通过php的命令行传递密码相比,更多进程或用户永远无法访问密码,而不是通过php的命令行传递密码。)

这应该通过export内置来实现POSIX合规性。或者,也可以使用仅限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)。

答案 1 :(得分:1)

php -r 'echo password_hash("$pw", PASSWORD_DEFAULT, [ "cost" => 11 ]) . "\n";'

Bash中的单引号字符串不进行变量扩展,因此您实际上是将字符串$pw传递给PHP进行解析,并且由于它不存在,因此您会收到来自PHP的警告。你得到的哈希可能是空字符串,不是你想要的字符串。尝试将php -r替换为脚本中的echo,以确切了解传递给php的内容。

出于安全原因,对export变量的建议是一个很好的选择(尽管你应该使用$_ENV,而不是$_SERVER),但是在一般情况下(即不是密码)这不是必需的。一旦你理解了Bash's quoting semantics(这无疑会令人困惑),正确引用字符串以便在Bash中评估变量很容易。

对于这种情况,只需反转字符串中的单引号和双引号即可:

php -r "echo password_hash('$pw', PASSWORD_DEFAULT, [ 'cost' => 11 ]) . '\n';"