如何通过ssh和psql从bash变量运行SQL命令?

时间:2012-11-13 10:22:03

标签: sql bash ssh escaping psql

我确实希望运行一个SQL命令,它通过ssh postgres@hostname psql dbname -c SQL_COMMAND存储在bash变量中。

考虑到SQL命令中有字符串,运行它的正确方法是什么,所以它被正确转义?

示例:SQL_COMMAND="SELECT 'aaa'"

我正在寻找一个解决转义问题的解决方案,因此我可以轻松运行其他SQL命令而无需自己逃避它们。

2 个答案:

答案 0 :(得分:3)

在shell中做这个很尴尬。鉴于我的选择,我会使用对元字符不太敏感的脚本语言。外壳很痛苦。我知道获得可靠原始字符串的唯一方法是使用(a)像read之类的输入函数; (b)临时档案;或(c)引用此处文件。

这就是我要做的事情,利用ssh传递stdin的方式:

$ ssh hostname psql <<"__END__"
SELECT 'aaa!*#${notavar}' FROM "generate_series"(1,2);
__END__

     ?column?     
------------------
 aaa!*#${notavar}
 aaa!*#${notavar}
(2 rows)

不幸的是,您无法轻松地将其包装在$( ... )中以将其存储在shell变量中。它似乎有效,但某些元字符如!会导致问题。

答案 1 :(得分: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的{​​{1}}选项的参数双重引用。