답변:
해결책 1 :
remote_output="$(ssh user@host "remote command")"
scp "user@$host:$remote_output" /local/path
이것은 원격 시스템에 연결하고 일부 명령을 실행하며 출력을 로컬 시스템의 변수에 복사하여 작동합니다. 파일 경로를 원격으로 에코하여 로컬로 캡처한다고 가정 해보십시오.
해결책 2 :
ssh user@host "determine_path; cat filename" >local_filename
원격에서 직접 파일을 찾아서 출력하고 로컬로 파일로 리디렉션하여 작동합니다. 이것은 scp를 건너 뜁니다. "cat"이전 단계에는 출력이 없어야합니다 (&> / dev / null로 해결할 수 있음).
다음 형식으로 스크립트를 작성할 수 있습니다.
command1
command2
...
ssh user@machine command3
...
command4
command5
command3
비밀번호를 묻지 않고 실행 하려면 SSH 키를 설정해야 합니다.
ssh user@remote command3
실행되고 command4
시작할 수 없습니다
ssh user@machine command3 &
복사하려는 파일을 식별하는 방법과이 식별을 수행하는 원격 시스템에서 실행될 스크립트 또는 명령 세트를 작성할 수 있거나 이미 가지고 있다는 것을 이미 알고 있다고 가정합니다. .
또한 해당 명령이 표준 출력에서 파일에 대한 전체 경로 또는 파일에 대한 상대 경로를 복사에 사용되는 SSH 사용자의 홈 디렉토리와 관련하여 인쇄한다고 가정합니다. 필자의 예제에서 스크립트 이름은 "getfilepath.sh"이지만 쉘 스크립트 일 필요는 없지만 다른 실행 파일이거나 일련의 명령 일 수도 있습니다.
# Script to be executed on local machine.
# put any leading local commands here.
FILE=$(ssh user@emote getfilepath.sh);
scp user@remotehost:"$FILE" .
# put any trailing local commands here.
위 코드에서 "$ ()"표기법은 명령의 표준 출력을 쉘 변수로 캡처하는 방법입니다. 상당히 표준 적이지만, 이해하지 못하는 쉘을 사용하는 경우, 대부분의 미국 키보드에서 1 키 왼쪽의 악센트 표시 인 "백 틱"으로 명령을 둘러 쌀 수 있습니다.