bash 스크립트를 작성할 수 있습니까?
- 머신 A에서 시작하고 SSH를 통해 다른 머신 B에 로그인합니다(머신 A와 B는 모두 Linux 머신입니다).
- 일부 파일을 시스템 B에 복사
- 이 머신에서 주어진 Python 스크립트를 실행하십시오.
- 결과를 머신 A로 다시 보냅니다.
- 컴퓨터 B에서 로그아웃합니다.
이것이 기술적으로 가능합니까?
답변1
물론 가능합니다:
scp file user@host:
ssh user@host path_to_script
scp user@host:file_to_copy ./
그게 다야 ...
하지만 문제가 있습니다. 비밀번호를 3번 입력하라는 메시지가 표시됩니다. 이를 방지하려면 SSH 키를 생성하고 이 키를 사용하여 사용자에게 권한을 부여할 수 있습니다.
SSH 키를 생성하려면 를 실행하고 ssh-keygen -t rsa
질문에 답한 후 원격 호스트(컴퓨터 B)에 대한 공개 키를 ~/.ssh/authorized_keys
파일에 복사합니다. 개인 키는 ~/.ssh/id_rsa
컴퓨터(A)에 로컬로 저장되어야 합니다.
답변2
ssh
단일 연결/세션으로 모든 작업을 수행 할 수 있습니다 .
ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst
이것:
local_src
에게 복사remote_dst
,- 구현하다
command
, remote_src
에게 복사local_dst
.
그러나 command
그것을 적어 보면 stdout
결과가 나올 것입니다 local_dst
. command
입력을 에서 읽으면 합계 stdin
를 받게 됩니다 EOF
.
답변3
단일 SSH 세션 내에서 이 작업을 수행할 수 있지만 파일 복사와 명령 실행을 결합하는 것은 약간 까다롭습니다.
이 작업을 해결하는 가장 쉬운 방법은 다음 세 가지 작업에 대해 별도의 SSH 세션을 실행하는 것입니다.
rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/
이를 위해서는 machineB에 대한 3번의 인증이 필요합니다. 다중 인증을 피하는 권장 방법은 최신 버전의 OpenSSH에서 연결 공유 기능을 사용하는 것입니다. B에 대한 기본 연결을 한 번에 시작하고 SSH가 해당 기본 연결에 자동으로 피기백하도록 합니다.당신의 ControlMaster auto
줄을 추가ControlPath
~/.ssh/config
, 백그라운드에서 기본 연결을 시작한 다음 작업을 실행합니다.
ssh -fN machineB # start a master connection in the background
# Subsequent connections will be slaves to the existing master connection
rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/
scp 또는 rsync를 사용하여 파일을 복사하는 것보다 아래의 원격 파일 시스템을 마운트하는 것이 더 쉬울 수 있습니다.SSHFS. 그런데 이렇게 하면 기본 연결 설정이 처리됩니다( ~/.ssh/config
위와 같이 연결을 설정했다고 가정).
mkdir /net/machineB
sshfs machineB: /net/machineB
cp -Rp inputs /net/machineB/
ssh machibeB 'some command -i inputs -o outputs'
cp -Rp /net/machineB/outputs .