로컬 파일과 원격 파일 간에 여러 diff 실행

로컬 파일과 원격 파일 간에 여러 diff 실행

여러 로컬 파일을 원격 호스트의 해당 파일과 비교하고 싶기 때문에 다음과 같은 스크립트를 만들고 싶습니다.

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

관련 정보