1. ホーム
  2. bash

[解決済み] bashでsshがwhileループから抜け出す [重複] [重複

2022-11-01 01:37:44

質問

私はこのbash-codeをリモートサーバにファイルをアップロードするために使用しています。

for i in `find devel/ -newer $UPLOAD_FILE`
do
    echo "Upload:" $i
    if [ -d $i ]
    then
        echo "Creating directory" $i
        ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
        continue
    fi
    if scp -Cp $i $USER@$SERVER:$REMOTE_PATH/$i
    then
        echo "$i OK"
    else
        echo "$i NOK"
        rm ${UPLOAD_FILE}_tmp
    fi
done

ただ、名前にスペースが含まれるファイルについては、forループが失敗するので、1行目をこのように置き換えた。

find devel/ -newer $UPLOAD_FILE | while read i
do
    echo "Upload:" $i
    if [ -d $i ]
    then
        echo "Creating directory" $i
        ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i"
        continue
    fi
    if scp -Cp $i $USER@$SERVER:$REMOTE_PATH/$i
    then
        echo "$i OK"
    else
        echo "$i NOK"
        rm ${UPLOAD_FILE}_tmp
    fi
done

何らかの奇妙な理由により、ssh-command は while ループから抜け出し、そのため最初の見つからないディレクトリはうまく作成されますが、それ以降のすべての見つからないファイル/ディレクトリは無視されます。

これは、ssh が標準出力に何かを書き、それが "read" コマンドを混乱させることと関係があるのだと思います。ssh コマンドをコメントアウトすると、ループが正常に動作するようになります。

なぜこのようなことが起こるのか、そしてどうすれば ssh が while ループを壊すのを防ぐことができるのか、誰かご存知でしょうか。

どのように解決するのですか?

問題点は ssh は標準入力から読み込むので、残りの行をすべて食ってしまうことです。その標準入力をどこにも接続しないようにすればよいのです。

ssh $USER@$SERVER "cd ${REMOTE_PATH}; mkdir -p $i" < /dev/null

また ssh -n をリダイレクトの代わりに使うこともできます。