작업을 수행하기 위해 다른 시스템에 로그인하는 bash 스크립트를 작성하는 방법은 무엇입니까?

작업을 수행하기 위해 다른 시스템에 로그인하는 bash 스크립트를 작성하는 방법은 무엇입니까?

bash 스크립트를 작성할 수 있습니까?

  1. 머신 A에서 시작하고 SSH를 통해 다른 머신 B에 로그인합니다(머신 A와 B는 모두 Linux 머신입니다).
  2. 일부 파일을 시스템 B에 복사
  3. 이 머신에서 주어진 Python 스크립트를 실행하십시오.
  4. 결과를 머신 A로 다시 보냅니다.
  5. 컴퓨터 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

이것:

  1. local_src에게 복사 remote_dst,
  2. 구현하다 command,
  3. 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 .

관련 정보