2012-11-13 146 views
2

我确实想通过ssh [email protected] psql dbname -c SQL_COMMAND运行一个存储在bash变量中的SQL命令。如何通过ssh和psql从bash变量运行SQL命令?

考虑到SQL命令在其中包含字符串,运行此操作的正确方法是什么,因此它已正确转义?

例子:SQL_COMMAND="SELECT 'aaa'"

我找的,是以逃逸的护理液,这样我就可以很容易地运行其他的SQL命令,而无需逃避他们自己。

回答

2

这在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变量。它似乎工作,但某些元字符如!会导致问题。

0

似乎通过只是在做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选项似乎工作。

+0

是的,但是会被“双引号”标识符分解。 –

+0

它似乎没有。 –

+0

从“generate_series”中选择'aaa'(1,2); –