web-dev-qa-db-ja.com

sshセッションでのローカル変数とリモート変数の操作

リモートサーバーで処理された後にいくつかのファイルを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

会社の制限により、実際の名前やフォルダ構造を投稿することはできません。

2
Galagenberg

スクリプトに欠けている部分は変数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)オプションを使用し、スクリプトの出力を変数に簡単にリダイレクトできるものに減らす方が簡単な場合があります。

4
Thomas Dickey

ファイルを調べる場合を除いて、リモートシステムでコマンドを実行する必要はないようです。したがって、リモートコマンドを実行してファイルを調べる代わりに、リモートファイルシステムをローカルマシンにマウントし、ローカルコマンドを使用してリモートファイルとローカルファイルの両方を調べます。 SSH経由でアクセスするリモートファイルシステムをマウントするには、 [〜#〜] sshfs [〜#〜] を使用します。

mkdir remote
sshfs "$remoteServer": remote
cd "$remoteServer/$someID"
for file in */*; do …
fusermount -u remote