我确实想通过ssh [email protected] psql dbname -c SQL_COMMAND
运行一个存储在bash变量中的SQL命令。如何通过ssh和psql从bash变量运行SQL命令?
考虑到SQL命令在其中包含字符串,运行此操作的正确方法是什么,因此它已正确转义?
例子:SQL_COMMAND="SELECT 'aaa'"
我找的,是以逃逸的护理液,这样我就可以很容易地运行其他的SQL命令,而无需逃避他们自己。
我确实想通过ssh [email protected] psql dbname -c SQL_COMMAND
运行一个存储在bash变量中的SQL命令。如何通过ssh和psql从bash变量运行SQL命令?
考虑到SQL命令在其中包含字符串,运行此操作的正确方法是什么,因此它已正确转义?
例子:SQL_COMMAND="SELECT 'aaa'"
我找的,是以逃逸的护理液,这样我就可以很容易地运行其他的SQL命令,而无需逃避他们自己。
这在shell中非常尴尬。鉴于我选择使用对元字符不太敏感的脚本语言。壳是痛苦的。我知道得到可靠的原始字符串的唯一方法是(a)输入函数如read
; (b)临时文件;或(c)在这里引用文件。
这里就是我会做,开发的方式ssh
通行证通过标准输入:
$ ssh hostname psql <<"__END__"
SELECT 'aaa!*#${notavar}' FROM "generate_series"(1,2);
__END__
?column?
------------------
aaa!*#${notavar}
aaa!*#${notavar}
(2 rows)
不幸的是,你不能轻易地包裹在$(...)
将其存储在一个shell变量。它似乎工作,但某些元字符如!
会导致问题。
似乎通过只是在做psql -c "$SQLCOMMAND"
% export SQLCOMMAND='select "generate_series"(1, 5, 1);'
% echo $SQLCOMMAND
select "generate_series"(1, 5, 1);
% psql -c "$SQLCOMMAND"
generate_series
-----------------
1
2
3
4
5
(5 rows)
或
对我的工作% export SQLCOMMAND="SELECT 'aaa' FROM \"generate_series\"(1,2);"
% echo $SQLCOMMAND
SELECT 'aaa' FROM "generate_series"(1,2);
% psql -c "$SQLCOMMAND"
?column?
----------
aaa
aaa
(2 rows)
只要你能正确地获得SQL语句转换成变量,双引号的参数psql
的-c
选项似乎工作。
是的,但是会被“双引号”标识符分解。 –
它似乎没有。 –
从“generate_series”中选择'aaa'(1,2); –