bash 스크립트를 작성할 수 있습니까?
- 컴퓨터 A에서 시작하고 다른 컴퓨터에 로그인합니다. 머신 B by ssh (머신 A와 B 모두 Linux-Machines)
- 일부 파일을 머신 B에 복사
- 이 머신에서 주어진 Python 스크립트를 Python 스크립트로 실행합니다.
- 결과를 시스템 A로 다시 전송
- 시스템 B에서 로그 오프합니다.
기술적으로 가능합니까?
답변
물론 가능합니다.
scp file user@host: ssh user@host path_to_script scp user@host:file_to_copy ./
그게 다입니다. …
하지만 한 가지 문제가 있습니다. 암호를 세 번 입력해야합니다. ssh 키를 생성하고 이러한 키로 사용자를 인증 할 수 없도록하기 위해
ssh를 생성하려면 키는 ssh-keygen -t rsa
를 실행하고, 질문에 답하고, 공개 키를 원격 호스트 (컴퓨터 B)에 ~/.ssh/authorized_keys
파일에 복사합니다. 개인 키는 ~/.ssh/id_rsa
로컬 컴퓨터 (A)에 있습니다.
댓글
Answer
단일 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
를 수신합니다.
답변
단일 ssh 세션 내에서이 작업을 수행 할 수 있지만 파일 복사를 실행중인 명령과 결합하는 것은 약간 까다 롭습니다.
이 작업을 처리하는 가장 쉬운 방법은 세 가지 작업에 대해 별도의 SSH 세션을 실행하는 것입니다.
rsync -a inputs/ machineB:inputs/ ssh machineB "some command -i inputs -o outputs" rsync -a machineB:outputs/ outputs/
이 작업을 수행하려면 machineB에 세 번 인증해야합니다. 여러 번 인증을 방지하는 권장 방법은 최신 버전의 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 o를 사용하는 대신 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 .
cat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
와 같은 비밀번호 프롬프트를 최소화하기 위해 조잡한 작업을 수행 할 수 있습니다. 비밀번호를 사용하려면
ControlMaster=yes
및ControlPath=/path/to/socketfile
<을 정의하여 항상 OpenSSH '의 연결 풀링을 사용할 수 있습니다. / div>를 누른 다음-f
로 하나의 ssh 연결을 시작하여 백그라운드 ssh를 실행합니다. 모든 후속 SSH 연결에 동일한 소켓 파일을 사용하도록 지시하십시오.