1

複数のsshおよびscp呼び出しを含む一連のコマンドをスクリプト化したいと思います。毎日、私は自分がこのタスクを手動で実行していることに気づきます。

ローカルシステムから、SYSTEM1からSYSTEM1にsshからSYSTEM1 mkdir / tmp / dataに
、SYSTEM2
からSYSTEM2にsshからSYSTEM2に
mkdir / tmp / data、
SYSTEM3にSSH

SYSTEM3:/ dataからSYSTEM2へのscpファイル:/ tmp / dataexitから
SYSTEM2へ
scpファイルからSYSTEM2:/ dataおよびSYSTEM2:/ tmp / dataからSYSTEM1:/ tmp / data
rm -fr SYSTEM2:/ tmp/data
出口からSYSTEM1へ
SYSTEM1:/ dataおよびSYSTEM1:/ tmp / dataからLOCAL:/ data
rm -fr SYSTEM1:/ tmp/dataへのscpファイル

私はこのプロセスを少なくとも1日1回行います。異なるシステム間を移動し、その後クリーンアップするのに約5〜10分かかります。これをbashスクリプトで自動化したいのですが、これまでのところ私のアマチュアの試みは成功していません。ご想像のとおり、システム通信は制限されています。つまり、LOCALはSystem1のみを認識でき、System2はSystem1とSystem3のみを認識でき、system3はsystem2のみを認識できます。これを行うための最良の方法は何ですか?さらに、System1は他の多くのシステムのハブであるため、SYSTEM2はユーザーが指定する必要があります(System3は、他のSYSTEM2と比較して常に同じ相対IP /ホスト名を持ちます)。

コマンドをシェルスクリプトに適切な順序で配置し、プロンプトが表示されたらパスワードを手動で入力しようとしましたが(これはすでに効率が大幅に向上します)、メソッドが機能しないか、スクリプトの実行が間違っています。さらに、「system2」が接続するパターン、コピーするデータのパターン、およびローカルシステム上のデータのターゲットの場所を取得するスクリプトのコマンドライン引数が必要です。

そのような

./grab_data system2 *05-14* ~/grabbed-data

検索を行ったところ、次のステップは、ローカルタスクを実行するスクリプトを各システムに配置し、それぞれのリモートシステムからsshコマンドを使用してスクリプトを実行することだと思います。もっと良い方法はありますか?どのコマンドを使用するかを検討する必要があります。また、この種のネストされたsshおよびscpの問題を自動化するための一般的なアプローチは何でしょうか。

私の説明は少し複雑かもしれないと思いますので、私が適切に説明しなかった領域については説明を求めてください。

ありがとう。

4

3 に答える 3

3

ssh接続を他のssh接続にトンネリングすることで、このプロセスを大幅に簡素化できます(この前の回答を参照)。私が行う方法は、次のエントリを使用してローカルシステムに.ssh/configファイルを作成することです。

Host SYSTEM3
        ProxyCommand    ssh -e none SYSTEM2 exec /usr/bin/nc %h %p 2>/dev/null
        HostName        SYSTEM3.full.domain
        User            system3user

Host SYSTEM2
        ProxyCommand    ssh -e none SYSTEM1 exec /usr/bin/nc %h %p 2>/dev/null
        HostName        SYSTEM2.full.domain
        User            system2user

Host SYSTEM1
        HostName        SYSTEM1.full.domain
        User            system1user

(これは、両方の中間ホストにnetcatが/ usr / bin / ncとしてインストールされていることを前提としています。そうでない場合は、stdin&stdoutをTCPセッションにゲートウェイする同等の方法を見つけてインストールする必要があります。)

この設定により、scp SYSTEM3:/data /dataLOCALで使用でき、SYSTEM1とSYSTEM2を自動的にトンネリングします(3つのSYSTEMnのパスワードを順番に要求します。これは、特に1つを間違えた場合、少し混乱する可能性があります)。

于 2012-05-15T04:40:42.613 に答える
0

複数のシステムに接続している場合、特に中間ホストを介して接続を転送する必要がある場合は、ssh-agent転送を有効にして公開鍵認証を使用することをお勧めします。そうすれば、認証する必要があるのは1回だけです。

リモートコマンドから終了ステータスを確認するだけでエージェント転送を使用したスクリプトSSHで十分な場合もありますが、複雑な処理を行う場合は、expectまたはexpect-liteを使用してSSH/SCPを駆動する方がよい場合があります。より柔軟な方法でセッション。特にExpectは、インタラクティブセッションの堅牢な代替品となるように設計されています。

シェルスクリプトに固執し、ファイル名が大幅に変更される場合は、次のようにSSHまたはSCPのラッパーをいつでも作成できます。

# usage: my_ssh [remote_host] [command_line]
# returns: exit status of remote command, or 255 on SSH error
my_ssh () {
    local host="$1"
    shift
    ssh -A "$host" "$@"
}

ssh-agentとラッパー関数の間には、自分の努力のための合理的な出発点が必要です。

于 2012-05-15T00:08:11.293 に答える
0

もう1つの方法は、rsyncを使用することです。これにより、必要なディレクトリが自動的に作成され、必要に応じて、コピーされたソースファイルが削除されます。

あなたの場合、あなたはコマンドで作業することができます

home:~$ ssh system1
system1:~$ ssh system2
system2:~$ rsync -aPSHiv system3:/data /tmp/data
system2:~$ exit
system1:~$ rsync -aPSHiv --remove-source-files system2:/tmp/data /tmp/data
system1:~$ rsync -aPSHiv system2:/data /tmp/data
system1:~$ exit
home:~$ rsync -aPSHiv --remove-source-files system1:/tmp/data /tmp/data
home:~$ rsync -aPSHiv system1:/data /data

これをゴードンのアプローチと組み合わせると、それを次のように減らすこともできます。

home:~$ rsync -aPSHiv system1:/data/ system2:/data/ system3:/data/ /data/

rsyncの違いに注意してください。前者はディレクトリとそのコンテンツを意味し、後者はコンテンツのみを意味します。それらを混同すると、別のディレクトリにディレクトリが作成される可能性があります。...data...data/datadata

さらに、パスワードの代わりに公開SSHキーを使用すると、作業が簡素化されます。

于 2012-05-15T05:25:48.863 に答える