我正在生成一个密码哈希,我希望以用户输入为基础,以便稍后在脚本中使用。我在下面尝试了bash变量语法的变体:
#!/bin/bash
printf "Enter password:"
read pw
php -r 'echo password_hash("$pw", PASSWORD_DEFAULT, [ "cost" => 11 ]) . "\n";'
我得到正确的哈希值,但只有在得到未定义的变量警告后才会显示。
当我将变量放在单引号中时,$ pw'然后输入密码为"密码"或者密码'我没有收到错误。
如何在没有未定义变量错误消息的情况下将bash变量传递给php命令或以其他方式将其分配给bash脚本中的php变量?
答案 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';"