Bash 스크립트에서 SSH를 종료한 후 어레이에 액세스해야 함

Bash 스크립트에서 SSH를 종료한 후 어레이에 액세스해야 함

동적으로 생성된 배열에 액세스해야 합니다.

먼저 코드를 살펴보세요:

ssh [email protected] <<'ENDSSH'
cd /home/ubuntu/user/someFolder
array=(`find . -name 'something*'`)
len=${#array[*]}

i=0
while [ $i -lt $len ]; do
    let i++
done
echo  "${array[*]}"  #here I can access array values
ENDSSH
#Just above i have exited from ssh & now I need to access array values but not getting.
echo  "${array[*]}" #here I'm unable to get array values
exit

내 관심사는 ENDSSH 이후에 배열에 액세스하는 것입니다.

답변1

백틱을 사용하고 find배열을 구성하는 데 익숙하기 때문에 데이터를 강력하게 직렬화하는 것에 대해 크게 걱정하지 않아도 됩니다(예: 출력의 공백이 find배열의 다른 요소로 분할되므로 바람직하지 않을 수 있음). 그냥 이렇게 하면 됩니다:

array=($( ssh [email protected] sh -c "find . -name 'something*'"))

그리고 localhost에 배열을 빌드합니다.

답변2

~에서당신의 댓글 중 하나, 당신이 하려는 일은 .txt 파일을 사용하여 원격 시스템에서 로컬 시스템으로 전송하려는 파일 경로 이름 목록을 만드는 것 같습니다 scp. 문제는 두 시스템 간에 경로 이름을 앞뒤로 전달하므로 공백 문자가 포함된 파일 이름이 손상될 위험이 있다는 것입니다.

원격 시스템 어딘가에 일치하는 모든 파일을 전송하는 방법을 찾고 있다면 something*다음과 같이 사용할 수 있습니다./home/ubuntu/user/someFolderrsync

rsync -av --include='*/' --include='something*' --exclude='*' \
    --prune-empty-dirs \
    [email protected]:/home/ubuntu/user/someFolder/ ./target

패턴 및 해당 파일이 위치한 디렉터리 구조와 일치하는 모든 파일을 찾아 로컬 컴퓨터의 경로로 전송합니다 ./target.

--include패턴은 --exclude왼쪽에서 오른쪽으로 적용되며 첫 번째 일치 항목이 중요합니다.

  • --include='*/': 모든 하위 디렉터리를 봅니다(빈 디렉터리, 즉 파일 이름이 일치하지 않는 디렉터리는 전송되지 않습니다 --prune-empty-dirs).
  • --include='something*': 우리가 정말로 관심을 갖는 것과 일치하는 패턴.
  • --exclude='*': 다른 것은 모두 무시하세요.

관련 정보