여러 로컬 파일을 원격 호스트의 해당 파일과 비교하고 싶기 때문에 다음과 같은 스크립트를 만들고 싶습니다.
ssh user@remote_host "cat remote_file1.txt" | diff - local_file1.txt
ssh user@remote_host "cat remote_file2.txt" | diff - local_file2.txt
...
ssh user@remote_host "cat remote_fileN.txt" | diff - local_fileN.txt
이 유형의 스크립트의 문제점은 각 파일의 비밀번호를 묻는 것입니다. 비밀번호를 한 번만 묻도록 하려면 어떻게 해야 합니까?
답변1
한 가지 방법은 비밀번호 없는 액세스(공개 키 인증)를 설정하는 것이고, 또 다른 방법은 연결을 재사용하는 것입니다. ~/.ssh/config
다음 내용으로 구성 파일을 만듭니다.
Host remote_host
User user
ControlPath ~/.ssh/controlmasters/%r@%h:%p
ControlMaster auto
ControlPersist 5m
디렉토리를 생성합니다 ~/.ssh/controlmasters/
:
mkdir -m 700 ~/.ssh/controlmasters/
그런 다음 스크립트를 실행할 때 비밀번호를 한 번만 요청해야 하며 다른 모든 명령은 이미 인증된 동일한 연결을 통해 실행됩니다.
답변2
다음 명령을 사용하여 비밀번호 없는 액세스를 생성할 수 없는 경우 ssh-keygen user@remotehost
일반 expect
도구를 설치하고 다음이라는 스크립트를 생성할 수 있습니다 passexpect
.
#!/usr/bin/expect -f
set timeout 20
set cmd [lrange $argv 1 end]
set password [lindex $argv 0]
log_user 0
eval spawn $cmd
expect "assword:"
send "$password\r";
interact
그런 다음 기본 쉘 스크립트에서 비밀번호를 한 번 읽을 수 있습니다.
printf "ssh password:" >&2; read -s pass; printf "\n">&2
SSH 명령에서 사용하십시오.
passexpect $pass ssh user@remotehost command_for_remote_host
또는 귀하의 목적에 따라 전체 스크립트는 다음과 같습니다.
#/usr/bin/env bash
printf "ssh password:" >&2; read -s pass; printf "\n">&2
./passexpect $pass ssh user@remotehost cat remoteF1.txt | diff - localF1.txt
./passexpect $pass ssh user@remotehost cat remoteF2.txt | diff - localF2.txt