2012-11-13 144 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); –