如何从远程计算机将Postgres查询保存到文件中

3
我有一个脚本,可以从Postgres数据库输出一些数据:
#!/bin/bash

dbname="inventory"
username="postgres"
NOW=$(date +"%d-%m-%Y-%H%M%S")
OUTPUT="output.$NOW"

psql $dbname $username << EOF
\o | cat >> $OUTPUT
select count(*) from component;
select * from product where procode='AAA';
\q
\o
EOF

如果我在本地机器上运行,这将愉快地将所需数据导出到文本文件。

现在,我想为10台远程计算机做同样的事情,并将输出存储在我从脚本运行的机器上的一个文件中。我有以下代码将从远程机器grep一些信息,但我还需要将上面的postgres数据添加到我的$ FILE_OUT中:

#!/bin/bash

NOW=$(date +"%d-%m-%Y-%H%M%S")
dbname="inventory"
username="postgres"

echo "Enter the file name"
read FILE_IN
FILE_OUT="invcheck.$NOW"

for i in $(cat $FILE_IN); do
echo $i >> $FILE_OUT

ssh user@$i "ps -efw | grep TRADINGTIMEPLUS /opt/jrms/jrms.ini" >> $FILE_OUT

我尝试将PostgreSQL代码放在一行中,如下所示:

ssh rmsasi@hj$i "psql $dbname $username << EOF \o | cat >> $FILE_OUT select * from component where code='1000';\q;\o; EOF"

但是我遇到了错误,postgres数据没有包含在$FILE_OUT中。
psql: warning: extra option o ignored
cat: from: No such file or directory
cat: component: No such file or directory
cat: where: No such file or directory
cat: code=1000: No such file or directory
bash: line 1: q: command not found
bash: line 1: o: command not found
bash: line 1: EOF: command not found

我只是一个新手,希望我只是忽略了一些简单的东西。

提前感谢您的帮助,如果有更好的方法来实现我想要的目标,我会感激任何指点。


感谢您首先展示代码,而不必被要求 :-)。 - Craig Ringer
\o | cat >> $OUTPUT 看起来很奇怪。为什么不直接使用 \o $OUTPUT?(编辑:哦,我明白了,你是在追加。不用管它了。) - Craig Ringer
1个回答

1

psql\ 命令以换行符而非分号结尾。在我看来有点不太好。

因此,您需要在命令中使用换行符。在 shell 中的引用文字面量内允许使用字面意义上的换行符,因此您可以在命令中插入它们,但最好是将您的 here-document 存储在本地,并通过 ssh 的 stdin 发送到 psql 的 stdin。这仍然会将输出留在远程机器上:

ssh rmsasi@hj$i "psql $dbname $username" << __EOF__
 \o | cat >> $FILE_OUT
SELECT * from component where code='1000';
\q
\o
__EOF__

最好从psql的标准输出或重定向中读取,而不是使用\o命令;这样输出会通过ssh会话返回,您可以在本地进行重定向:

echo "SELECT * from component where code='1000';" |\
ssh rmsasi@hj$i >> $FILE_OUT \
  "psql --quiet --no-align --no-readline --tuples-only -P footer=off --no-password $dbname $username"

或者你可以让psql从其他机器上的网络连接。

由于您正在使用bash驱动psql,因此您可能需要知道您可以使用协同处理进行交互。您也无需像那样将输出重定向到暂存文件;只需抑制psql的提示和标头打印(请参阅链接的答案),然后您可以直接从psql的stdout读取结果。


谢谢Craig,这解决了我的问题,我很感激你提供的额外信息 - 解决问题并学到新知识总是很好的。我从某个网站上拾取了这只猫,但按照你的建议将它移除后,它运行得很好。 - Rob
@Rob 很高兴能帮忙。我喜欢ssh在网络脚本编写中的强大功能。 - Craig Ringer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接