원격 서버에서 파일이 처리된 후 일부 파일을 나에게 보내도록 하는 스크립트를 작성 중입니다. 이를 위해서는 스크립트가 실행되는 로컬 서버의 변수가 필요하고 나중에 원격 서버의 일부 변수가 필요합니다.
나는 여러 가지 방법을 시도했지만 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