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 台のリモート コンピューターに対して同じことを行い、スクリプトを実行したマシン上の 1 つのファイルに出力を保存したいと考えています。リモート マシンからいくつかの情報を 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

私はpostgresコードを次のような行に入れようとしました:

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

私はスクリプティングが初めてなので、単純なものが欠けていることを願っています。

事前に感謝します。私が達成しようとしていることを行うためのより良い方法があれば、どんな指針にも感謝します。

4

1 に答える 1

1

psql\コマンドは、セミコロンではなく改行で終了します。いぼIMOのビット。

そのため、コマンドに改行が必要です。リテラルの改行は、シェル内の引用符で囲まれたリテラル内で許可されるため、コマンドに挿入できますが、ヒアドキュメントをローカルに用意して、 psql'sstdin経由でssh'sstdinに送信することをお勧めします。ただし、これでも出力はリモートマシンに残ります。

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

コマンドpsqlを使用するよりも、代わりに's 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"

psqlまたは、他のマシンからネットワーク経由で接続することもできます。

bashから運転しているので、コプロセスpsqlを使用してインタラクティブに実行できることを知りたい場合があります。また、出力をそのような一時ファイルにリダイレクトする必要はありません。プロンプトとヘッダーの出力を抑制するだけで(リンクされた回答を参照)、 stdoutから結果を読み取ることができます。psqlpsql

于 2012-08-28T02:41:30.707 に答える