我有一个从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台远程计算机执行相同的操作,并将输出存储在运行脚本的计算机上的一个文件中。我有下面的代码,可以从远程计算机中获取一些信息,但我还需要将上面的postgres数据添加到下面的$FILE中:
#!/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

我试着把postgres代码排成这样一行:
ssh rmsasi@hj$i "psql $dbname $username << EOF \o | cat >> $FILE_OUT select * from component where code='1000';\q;\o; EOF"

但是我有错误,而且postgres数据不包括在$FILE中
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

我只是一个新的脚本,所以希望我只是错过了一些简单的东西。
我提前表示感谢,如果有更好的方法来完成我正在努力实现的目标,我会感谢你的任何指点。

最佳答案

psql\命令以换行符而不是分号结束。我有点不对劲。
因此,您需要在您的命令换行。在shell中引用的文本中允许使用文本换行符,因此您可以在命令中插入它们,但是最好在本地使用您的here文档,并通过psql的stdin将其发送到ssh的stdin。这仍然会将输出留在远程计算机上,但是:

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

最好是从psql的stdout中读取或重定向它,而不是使用\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"

或者,您可以从其他机器通过网络连接。
因为您是从bash中驾驶psql的,所以您可能想知道您可以使用a co-process进行交互。您也不需要将输出重定向到这样的临时文件;只需取消psql对提示和标题的打印(请参阅链接的答案),就可以从psql的stdout读取结果。

关于bash - 如何将Postgres查询保存到远程计算机上的文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12151960/

10-15 01:35