linux 如何在PostgreSQL语句中包含来自环境变量的值的单引号[重复]

byqmnocz  于 2023-04-20  发布在  Linux
关注(0)|答案(2)|浏览(168)

此问题已在此处有答案

Difference between single and double quotes in Bash(7个回答)
2天前关闭。
这一行命令是我从我的一个bash脚本中选择的,我试图用它来自动化在Amazon Linux机器上的PostgreSQL数据库的初始设置。
我有一个名为TEST_PASSWORD的环境变量,其中包含值TestSecret。我需要在SQL语句中使用单引号(如'TestSecret')传递此值。
因此,正如预期的那样,它在方法-1中有效,但在方法-2方法-3中无效,如下图所示:

方法一:

[root@host ~]# psql -U postgres -c "create user testuser with encrypted password 'TestSecret';"
CREATE ROLE

方法二:

[root@host ~]# psql -U postgres -c "create user testuser with encrypted password $TEST_PASSWORD;"
ERROR:  syntax error at or near "TestSecret"
LINE 1: create user testuser with encrypted password TestSecret;
                                                     ^

方法三:

[root@host ~]# psql -U postgres -c "create user testuser with encrypted password \'$TEST_PASSWORD\';"
ERROR:  syntax error at or near "\"
LINE 1: create user testuser with encrypted password \'TestSecret\';
                                                     ^

我该如何克服这一点?

mwg9r5ms

mwg9r5ms1#

琐碎的答案是:只需替换密码本身,并保持其他所有内容与您在工作命令中的一样:

psql -U postgres -c "create user testuser with encrypted password '$TEST_PASSWORD';"

但是,这会让你容易受到SQL injection的攻击。在命令行中没有好的方法来对抗它。你可以像this answer一样自制自己的解决方案,或者你可以将工作委托给另一种语言,一种支持参数化查询的语言。

uqcuzwp8

uqcuzwp82#

在环境变量引用周围使用单引号

psql -U postgres -c "create user testuser with encrypted password '$TEST_PASSWORD';"

相关问题