リモートサーバーで処理された後にいくつかのファイルをscpするスクリプトを書いています。そのためには、スクリプトを実行するローカルサーバーの変数と、後でリモートサーバーのいくつかの変数も必要です。
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
会社の制限により、実際の名前やフォルダ構造を投稿することはできません。
スクリプトに欠けている部分は変数rc
のようです。スクリプト(ほとんどの場合)はローカルマシンで実行されているので、
$rc
を一時ファイルにエコーし、一時的なファイル名の場合、mktemp
でよく行われるため、断片は次のようになります。
mytemp = $(mktemp) trap "rm -f $ mytemp" EXIT HUP INT QUIT
# `SSH_CLIENT`からIPアドレスを取得 my_addr =\$(echo"\$ SSH_CLIENT "| awk '{printf\$ 1;}') result =\$(mktemp) echo "\ $ rc">\$ result scp\$ result\$ my_addr:$ mytemp rm -f\$ result
rc = $(cat $ mytemp)
$someID
がローカルサーバーからリモートに渡されない理由は、ヒアドキュメントがで始まるためです。
ssh -v $remoteServer << 'EOF' >> $LOG 2>&1
quoted'EOF'
マーカーがあり、ssh
コマンドに渡す前に文字列を展開しないようにシェルに指示します。拡張が必要な場合は、引用符を削除してください。ただし、これを行う場合は、remoteシェルを展開する各$
文字の前に円記号を付ける必要があります。
Ssh/scpに-q
(quiet)オプションを使用し、スクリプトの出力を変数に簡単にリダイレクトできるものに減らす方が簡単な場合があります。
ファイルを調べる場合を除いて、リモートシステムでコマンドを実行する必要はないようです。したがって、リモートコマンドを実行してファイルを調べる代わりに、リモートファイルシステムをローカルマシンにマウントし、ローカルコマンドを使用してリモートファイルとローカルファイルの両方を調べます。 SSH経由でアクセスするリモートファイルシステムをマウントするには、 [〜#〜] sshfs [〜#〜] を使用します。
mkdir remote
sshfs "$remoteServer": remote
cd "$remoteServer/$someID"
for file in */*; do …
fusermount -u remote