Heroku 和 PostgreSQL 命令行使用 -c/--command 来处理包含需要转义的字符的查询
Heroku and PostgreSQL command-line using -c/--command to process query with characters that need to be escaped
就转义字符而言,我熟悉 MySQL 的语法。但是,由于我目前正在构建的 Rails 应用程序上的 Ruby 使用 PostgreSQL,因此我正在努力让命令行正常运行。我正在尝试 运行 通过 shell 脚本进行基本查询,同时将数据库重新设置为实时数据库的最新备份。
例如,我尝试 运行 的命令如下所示:
psql db_name u_name -c "UPDATE users SET encrypted_password = 'crazy_long_hash_here';"
我理解 运行 查询的安全隐患,但这是针对开发工作站的,我们需要能够以不同的 类 用户身份登录以测试不同的功能。
我在 运行 执行此命令时遇到的问题是应用程序崩溃并出现 Ruby 异常:
BCrypt::Errors::InvalidHash
此消息明确指出散列值不再正确。但是,如果我运行在标准命令行样式中执行相同的命令如下:
psql db_name u_name
db_name=# UPDATE users SET encrypted_password = 'crazy_long_hash_here';
UPDATE (row count)
该命令将密码重置为所需的通用密码,我能够以任何用户身份登录以正确测试任何功能。
我缺少转义程序的哪一部分?散列中使用标准 [0-9][a-zA-Z] 字符集之外的以下字符:
$ .
如有任何帮助,我们将不胜感激,因为 google 在这件事上似乎出奇地沉默。我发现的唯一其他问题没有帮助:Escaping single quotes in shell for postgresql
更新
我也尝试过使用 here-document 语法,但无济于事:
psql db_name u_name << EOF
UPDATE users SET encrypted_password = 'crazy_long_hash_here';
EOF
视情况而定,稍微摆弄一下就得到了答案。当 运行 命令通过标准 psql
接口时,我需要将 $
转义为 $
。
然而,当运行时,这继续失败:
heroku pg:psql -c "UPDATE users SET encrypted_password = 'hash_with_$_in_string';"
答案是双重转义字符,意思是:
heroku pg:psql -c "UPDATE users SET encrypted_password = 'hash_with_\$_in_string';"
一旦 \
和 $
都被转义,heroku toolbelt 正确地解释了哈希,一切都很好。
就转义字符而言,我熟悉 MySQL 的语法。但是,由于我目前正在构建的 Rails 应用程序上的 Ruby 使用 PostgreSQL,因此我正在努力让命令行正常运行。我正在尝试 运行 通过 shell 脚本进行基本查询,同时将数据库重新设置为实时数据库的最新备份。
例如,我尝试 运行 的命令如下所示:
psql db_name u_name -c "UPDATE users SET encrypted_password = 'crazy_long_hash_here';"
我理解 运行 查询的安全隐患,但这是针对开发工作站的,我们需要能够以不同的 类 用户身份登录以测试不同的功能。
我在 运行 执行此命令时遇到的问题是应用程序崩溃并出现 Ruby 异常:
BCrypt::Errors::InvalidHash
此消息明确指出散列值不再正确。但是,如果我运行在标准命令行样式中执行相同的命令如下:
psql db_name u_name
db_name=# UPDATE users SET encrypted_password = 'crazy_long_hash_here';
UPDATE (row count)
该命令将密码重置为所需的通用密码,我能够以任何用户身份登录以正确测试任何功能。
我缺少转义程序的哪一部分?散列中使用标准 [0-9][a-zA-Z] 字符集之外的以下字符:
$ .
如有任何帮助,我们将不胜感激,因为 google 在这件事上似乎出奇地沉默。我发现的唯一其他问题没有帮助:Escaping single quotes in shell for postgresql
更新
我也尝试过使用 here-document 语法,但无济于事:
psql db_name u_name << EOF
UPDATE users SET encrypted_password = 'crazy_long_hash_here';
EOF
视情况而定,稍微摆弄一下就得到了答案。当 运行 命令通过标准 psql
接口时,我需要将 $
转义为 $
。
然而,当运行时,这继续失败:
heroku pg:psql -c "UPDATE users SET encrypted_password = 'hash_with_$_in_string';"
答案是双重转义字符,意思是:
heroku pg:psql -c "UPDATE users SET encrypted_password = 'hash_with_\$_in_string';"
一旦 \
和 $
都被转义,heroku toolbelt 正确地解释了哈希,一切都很好。