
リモートサーバーでファイルが処理された後にいくつかのファイルを送信するスクリプトを作成しています。これには、スクリプトが実行されるローカルサーバーの変数が必要で、後でリモートサーバーの一部の変数が必要です。
私はいくつかの方法を試しましたが、Stack Exchange
これまでのどれも私にはうまくいきませんでした。
以下に初期スクリプトを示します。
#!/bin/bash
set -x
export someID=$1
LOG=/folder/subfolder1/$someID/tmp/getResult.log
export DIR=/folder/subfolder1/$someID
export rc=0
export lServ=`hostname`
case $lServ in
test.server*)
remoteServer=remote.test.server
;;
prod.server*|backup.server*)
remoteServer=remote.prod.server
;;
esac
cd $DIR
ssh -v $remoteServer << 'EOF' >> $LOG 2>&1
cd $someID
folders=`ls`
for file in $folders; do
case $file in
*.1)
scp -v $file/outputFolder/$file.someExt $lServ:$DIR/p.someExt
rc=`expr $rc + $?`
;;
*)
export subID=`echo $file | awk -F"." '{print $2}'
scp -v $file/outputFolder/$file.ext $lServ:$DIR/k$subID.someExt
rc=`expr $rc + $?`
;;
esac
done
case $rc in
0)
cd ..
rm -rfv $someID
export rc=$?
;;
*)
echo "some Errormessage"
rc=`expr $rc + 1`
;;
esac
EOF
rc=`expr $rc + $?`
exit $rc
会社の制限により、本名やフォルダ構造を公開できません。
答え1
スクリプトの欠落部分は変数のようですrc
。スクリプトは(ほとんど)ローカルコンピュータで実行されるため、次のことができます。
- 一時ファイル名を作成してください外部リダイレクトされた部分、
- その名前を使用してください~へリダイレクトされた部分と
$rc
一時ファイルにエコー- 方向が指定されたセクションの外側の変数を読み込みます。
一時ファイル名の場合、通常は補完機能が使用されるため、mktemp
これらのスニペットは次のとおりです。
- 外部
mytemp=$(mktemp) "rm -f $mytemp" トラップ EXIT HUP INT QUIT
- ~へ
# `SSH_CLIENT`から私のIPアドレスを取得します。 my_addr=\$(echo "\$SSH_CLIENT" |awk '{printf \$1;}') 結果=\$(mktemp) エコ"\$rc" >\$結果 scp \$result\$my_addr:$mytemp rm -f \$結果
- 外部
rc=$(猫$私の一時)
ローカルサーバーからリモートサーバーに転送されない理由は、$someID
ここで文書が次に終了するためです。
ssh -v $remoteServer << 'EOF' >> $LOG 2>&1
持つリーダー'EOF'
コマンドに文字列を渡す前に文字列を拡張しないようにシェルに指示するフラグですssh
。拡張するには、引用符を削除してください。ただし、これを行うには、$
必要な各文字の前にバックスラッシュを追加する必要があります。離れて広がる殻。
ssh / scpの(quiet)オプションを使用-q
して、スクリプトの出力を変数に簡単にリダイレクトできるものに減らす方が簡単です。
答え2
ファイルを確認する以外に、リモートシステムでコマンドを実行する必要はないようです。したがって、ファイルを確認するためにリモートコマンドを実行する代わりに、ローカルシステムにリモートファイルシステムをマウントし、ローカルコマンドを使用してリモートファイルとローカルファイルを確認します。 SSH 経由でアクセスされるリモートファイルシステムをマウントするには、次のようにします。SSHFS。
mkdir remote
sshfs "$remoteServer": remote
cd "$remoteServer/$someID"
for file in */*; do …
fusermount -u remote