2011-08-05 7 views
0

をビヘイビア私は約2日間シェルスクリプトSSHは

をシェルスクリプトをコーディングし始め、現在、私は次のコード

echo "Permission to Access to Remote Machine" 
ssh [email protected]$HOSTNAME "pg_dump -f /dbexport.sql -t tb1 -t tb2 -t tb3 dbname" 
echo "Permission to Access to Remote Machine to transfer data file" 
scp [email protected]$HOSTNAME:/dbexport.sql /export/bin/ 
echo "Permission to delete temporary file on remote machine" 
ssh [email protected]$HOSTNAME "rm /dbexport.sql" 
echo "Creating Database..." 

を持っている今、私は2つの質問

1-持っている良い方法があります一度この操作を行うには?私は現在3回それをしなければなりません...そして、私は他のサードパーティのスクリプトを期待して使用したくありません.SS認証にRSA鍵を使用したいのでもありません。

2がありますか?そのコマンドに失敗しましたか?あなたの最初の質問については

どうもありがとう

+0

最初の行に不一致があります。 –

+0

なぜRSAキーを使用したくないのですか? (あなたの理由はDSAキーにも等しく当てはまると思います) –

答えて

2

データベースをローカルファイルにリモートでダンプするには、stdoutにダンプしてローカルにリダイレクトします。

ssh [email protected]$HOSTNAME "pg_dump -f /dev/stdout -t tb1 -t tb2 -t tb3 dbname" > /export/bin/dbexport.sql 

サーバーで実行されたコマンドラインの戻りコードは、ssh呼び出しの戻りコードとして返されます。 sshが失敗した場合(例:接続の問題)、255になります。すべて正常であれば、0になります。

Bashは、最後に実行されたコマンドのリターンコードをシェル変数$?

ssh [email protected]$HOSTNAME "pg_dump -f /dev/stdout -t tb1 -t tb2 -t tb3 dbname" > /export/bin/dbexport.sql 
err=$? 
if [ $err -ne 0 ]; then 
    echo "Dump failed with error code ${err}!" 
fi 

それとも、正確な値に興味がない場合:あなたは、次のようにそれを使用することができ

if ! ssh [email protected]$HOSTNAME "pg_dump -f /dev/stdout -t tb1 -t tb2 -t tb3 dbname" > /export/bin/dbexport.sql; then 
    echo "Dump failed!" 
fi 

pg_dump manページは、おそらくあなたはそれのためのエラーコードを提供します。 sshのmanページから:あなたは絶対に(私は理解していない)のキーで動作するようにしたくない

EXIT STATUS 
    ssh exits with the exit status of the remote command or with 255 if an 
    error occurred. 
+0

それは素晴らしいようです! sshの戻り値についての詳細を私に教えてください。 何らかの理由で失敗した場合はfalseを返します...たとえ間違ったパスワードですか? – Killercode

+0

上記の回答に戻り値情報を追加しました。 – Yaron

0

は、私はあなたが

ような何かを行うことができ、彼らはすべてのリモートマシン上でコマンドを実行した場合は1に3つのコマンドを組み合わせるための良い方法を考えることはできません
ssh [email protected] sh -c 'dothis ; dothat' 

あなたは真ん中にscpを持っています。私はRSAまたはDSAキーを使用したいが、あなたはそれをしたくないと言った(なぜ?)。

第2の質問では、sshscpの両方のコマンドは、成功したかどうかを示すステータスを返します。たとえば、次のようになります。

ssh [email protected] /bin/false ; echo $? 

は、1を出力して、失敗を示します。 cshまたはtcshを使用している場合は$?$statusに変更してください)。マニュアルページ(man sshman scp)を読んで、下部にある「終了ステータス」セクションを探してください。

0

場合は、接続をオープンし、その後、それを使用する方法があります。

あなたはSSHオプションControlMasterControlPathで作業することができますパスワードを尋ねると、あなたがControlPathにそうするように言わ場所に制御ソケットを残して、最初の接続を確立するためにControlMaster=yesを使用しています。続いて、sshコマンドにこのソケットをControlMaster=noで使用するように指示します。

しかし、ここでは、セキュリティリスクの可能性があるこの制御接続をどのように取り除くかについては、適切なタイミングではわかりません。たぶん、-Nfを、完全なプロセスがどれくらいの期間続くかによって、-f 'sleep 30m'と置き換えることができます。

リモートのstdoutに他の出力がない場合は、一時ファイルを使用せずにパイプ経由で直接SQLダンプを取得することもできます。

ssh [email protected]$HOSTNAME "pg_dump -f - -t tb1 -t tb2 -t tb3 dbname" > /export/bin/dbexport.sql 

短期間で整頓され、中間ファイルを妨害することはありません。 (しかし、私は-f -部分について確認していない - 多分標準出力に出力するようにそのようなものをpg_dumpのを伝えるための別の方法があります。)、アウトファイル作成して、リモートサーバからローカルマシンに

0

コピー

パイプを使用

ssh -C {ssh.user}@{remote_host} \ 'PGPASSWORD = {remote_dbpassword} pg_dump -U {remote_dbuser} {remote_dbname} | bzip2 -c '\ | bunzip2 -dc | PGPASSWORD = {local_dbpassword} psql -U {local_dbuser} {local_dbname}

関連する問題