我確實想通過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); –