0
ssh -p 10551 -S /tmp/manpagemaker/ssh.connect -MfN root@192.168.1.25

for xe in ${XECOMMANDS[@]} ;do

    xe=$(echo ${xe#*-}) ; xe=$(echo ${xe%.*})
    ssh -p 10551 -S /tmp/manpagemaker/ssh.connect root@192.168.1.25 t 'bash -s' < ./manpagemaker.sh "$xe"

done

これを行うより良い方法はありますか?私の方法は非常に効率が悪いように感じます。

マンページの asciidoc テンプレートを作成するスクリプトを作成しました。xapi の一部である xe コマンドのマンページを書いています。「manpagemaker.sh」スクリプトは、適切に実行される xe コマンドに依存しています。これは、リモートの xenserver クラウドに存在します。

したがって、実行する必要がある manpagemaker のすべてのインスタンスに対して新しい ssh 接続を開く代わりに、名前付きパイプを使用して xenserver クラウドにストリーミングする方法はありますか? stdout に送信されたすべてのテキストをキャプチャするには、最終的にリダイレクトを追加する必要があることに注意してください。

4

1 に答える 1

0

関数を xargs にパイプすることができます:

showCommands() {
    for xe in ${XECOMMANDS[@]}; do
        xe=$(echo ${xe#*-}) ; xe=$(echo ${xe%.*})
        echo "$xe"
    done
}

showCommands | xargs -l1 ssh -p 10551 -S /tmp/manpagemaker/ssh.connect root@192.168.1.25 t 'bash -s' < ./manpagemaker.sh

の内容はわかりませんが、XECOMMANDSファイル名に空白文字が含まれている場合、このコードが壊れているようです。これを修正する方法は次のとおりです。

showCommands() {
    for xe in "${XECOMMANDS[@]}";do
        echo -n "$xe"
        echo -ne '\0'
    done
}

showCommands | xargs -0 -l1 ssh -p 10551 -S /tmp/manpagemaker/ssh.connect root@192.168.1.25 t 'bash -s' < ./manpagemaker.sh

-l1xargs がパイプ入力を 1 行ずつ読み取ることを意味します。

ファイル名にヌル文字を含めることはできないため、以前\0はパラメーターを分割していました。

複数のパラメーターを ssh に渡したい場合は、-l1 つ増やして別のエコー出力を追加する必要があります。次に例を示します。

showCommands() {
    for xe in "${XECOMMANDS[@]}";do
        echo -n "$xe"
        echo -ne '\0'
        echo -n 'This is another parameter'
        echo -ne '\0'
    done
}

showCommands | xargs -0 -l2 ssh -p 10551 -S /tmp/manpagemaker/ssh.connect root@192.168.1.25 t 'bash -s' < ./manpagemaker.sh
于 2013-08-23T14:33:08.033 に答える