2017-02-07 4 views
0

私はリモートマシン上でいくつかのコマンドを実行する必要があり、ローカルマシン上にこのようなスクリプトを書いています。
リモートサーバで複数のコマンドを実行して出力を取得する方法は?

私はローカルマシン上でdocker imagesを取得していますが、これらのイメージがリモートサーバーに存在するかどうかを確認する必要があります。

ローカルマシンに既存のドッカーイメージ(リモートサーバー)を追加する必要があります。そのために私は下記のコードを使用しましたが、それは私のためには機能しませんでした。

#!/bin/sh 
declare array=$(docker images) 
sshpass -p 'password' ssh -t [email protected] << EOF 
declare List="" 
while read -r line; do 
    if [ -z $(docker images -q $line) ]; then 
    List="$List $line" 
    else 
    continue 
    fi 
done <<< "$array" 
EOF 

リスト変数を自分のローカルマシンに追加します。

この問題についてお手伝いできますか?
ご協力いただき誠にありがとうございます。
よろしくお願いいたします。

+0

なぜ、 'echo" $ List "ではないのですか? –

+0

私はそれが画面に印刷エコーを行う場合。どのように私はそれをさらに使用するために私のローカルマシン内のいくつかの変数にキャプチャすることができます。 – kala

+0

'sshpass -p 'password' ssh -t [email protected]> local_file << EOF ...' –

答えて

0

リモートシェルを終了すると、リモートシェルで行う操作はローカルシェルにはありません。あなたができることは、リモートシェルプリントアウトプットを持ってそれをキャプチャすることです。

byでは、/bin/shスクリプトで配列を使用することはできませんが、実際に配列は必要ありません。

#!/bin/sh 
docker images | 
sshpass -p 'password' ssh -t [email protected] ' 
    while read -r line; do 
    # Suction: docker images -q image should return nonzero exit status 
    # if the named image is missing. We work around that by grepping 
    # for whether there is any output at all. 
    docker images -q "$line" | grep -q . || echo "$line" 
    done' 

これはちょうど結果を出力します。それを変数に取り込んだり、ファイルにリダイレクトしたりして、別のローカルのwhile read -rループにパイプするだけです。

これをリファクタリングすると、たとえば次のようになります。認証の詳細がパラメータ化されているので、多数のホストに対して実行することができます。実行可能なスクリプトとして保存することができますので、他のツールから呼び出すことも、限られたコンテキストで必要な場合に関数として呼び出すこともできます。あなたが書き換え可能性がよりhttps://docs.docker.com/engine/reference/commandline/dockerd/#/daemon-socket-option

missing() { 
    docker images -q | 
    "[email protected]" 'while read -r line; do   
     docker images -q "$line" | grep -q . || echo "$line" 
    done' 
} 

今、あなたは、1つのまたは複数のホストのためにそれを呼び出すことができます。あなたの要件に応じて

missing sshpass -p 'password' ssh -t [email protected] | 
xargs -r -n 1 docker pull 
+0

http://stackoverflow.com/questions/5725296/difference-between-sh-and-bashでは、shとbashの違いについて説明します。 – tripleee

+0

sshコマンドライン全体をパラメタ化するのは、やや疑わしいデザインですが、少なくともモジュール化して再利用可能にする方法を探るように促すはずです。 – tripleee

+0

本当にうまく動作します。私はsshapssコマンドが見つからないと言うジェンキンズでこのスクリプトを実行しています。私たちは何もインストールするつもりはありません。とにかくssh -p 'password' -u 'username'のようなパスワードを持つsshコマンドを使用するのですか? – kala

0

、あなたはまた、ドッキングウィンドウソケットをリモートで利用できるようにすることができあなたのスクリプトはローカル/リモートドッカーエンジンに接続するようにスクリプトを作成します:

DOCKER_HOST=unix:///var/run/docker.sock/ docker images ... 
DOCKER_HOST=tcp://remote.ip:2375 docker images ... 

私はそれがあなたが求めているものではないことを知っていますが、おそらく他の人に影響を与えます。

関連する問題