0

リモートファイルにsshしてファイルが存在するかどうかを確認し、存在する場合はsshで最初のサーバーに戻り、コマンドを実行して完了する方法を見つけようとしています。これまでのコードのスニペットは次のとおりです。

for file_name in $(ls $FILE_DIR/)
do
    ssh user@remote.com: home/some/directory
    'if [ -f $DIRECTORY/$file_name ]
    then
        ssh user@originalserver.com: home/some/Directory
        'scp user@remote.com: $DIRECTORY/$file_name $DIRECTORY/$file_name"_"$(date +%Y%m%d%H%M%S)


    fi''
        scp user@remote.com $FILE_DIR/$file_name $DIRECTORY/$file_name

スクリプトを実行すると、リモート サーバーへの接続がコマンド ラインで開かれ、残りのスクリプトは実行されません。

また、私がやろうとしていることは有効ですか?ssh 経由でアクセスしたサーバー内で ssh できますか?

4

2 に答える 2

2

だから私はいくつかの提案があります:

  1. リモート コマンドを実行する場合、tty をシミュレートすることが重要な場合があります。これを行うには、stdin が端末でなくても ssh -t -t を試して疑似 tty 割り当てを強制します。

  2. salt-stack の使用について考えたことはあります か? Salt を使用すると、ネットワーク上の複数のマシンでリモート コマンドを並行して実行できます。Salt は、他のマシンでリモート コマンドを実行するための優れたソリューションであり、セットアップも非常に簡単です。

  3. スクリプトを実行する前に、bash -x を使用してリモート コマンドを実行してみてください。そうすれば、状況のデバッグに役立つすべての出力が表示されるはずです。それでも不十分な場合は、標準出力/エラーをファイルにリダイレクトして、何が問題なのかを確認してください。

    ssh user@remote.com 'bash -x ./script_2004.5664 | ティー -a ~/some.log > 2>&1'

于 2013-08-21T07:14:58.243 に答える
1

まず、ls を使用してファイルを反復処理しないでください。Bashはそれを単独で行うことができます。

for file_name in "$FILE_DIR"/*

[[ ]] の代わりに [[ ]] も使用します。

おそらくあなたが望むことをするスクリプトは次のとおりです。

for filename in "$FILE_DIR/"*; do
    # Check if file exists on the remote server
    if [[ $(ssh user@remote.com "[[ -f $DIRECTORY/$filename ]] && echo 1") ]]; then
        # Download that file
        scp user@remote.com: "$DIRECTORY/$filename" "$DIRECTORY/${filename}_$(date +%Y%m%d%H%M%S)"
    fi
done
于 2013-08-21T07:18:18.033 に答える