SSH 세션에서 로컬 및 원격 변수 사용

SSH 세션에서 로컬 및 원격 변수 사용

원격 서버에서 파일이 처리된 후 일부 파일을 나에게 보내도록 하는 스크립트를 작성 중입니다. 이를 위해서는 스크립트가 실행되는 로컬 서버의 변수가 필요하고 나중에 원격 서버의 일부 변수가 필요합니다.

나는 여러 가지 방법을 시도했지만 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

관련 정보