bash를 사용하여 테스트 사용자 목록과 호스트 목록을 사용하여 SSH 연결 테스트를 스크립트하려고 합니다. 도와주실 수 있나요?

bash를 사용하여 테스트 사용자 목록과 호스트 목록을 사용하여 SSH 연결 테스트를 스크립트하려고 합니다. 도와주실 수 있나요?

해당 테스트 사용자 계정 집합을 사용하여 호스트 집합에 대한 SSH 연결을 테스트하려고 합니다.

testuser1 test ssh connection to server1즉 , testuser2 test ssh connection to server2, testuser3 test ssh connection to server3등 입니다.

각 테스트 사용자는 개인 키를 사용하여 로그인합니다. ssh -i ~/keys/testuser1key testuser1@server1

그런데 이 정보를 변수에 넣을 때 문제가 발생했습니다. 이것은 내가 지금까지 가지고 있는 스크립트입니다.

for host in $(cat hosts)
do
   if
      ssh -i $host 'true' exit
   then
      echo "SSH connection for $host ok"
   else
      echo "SSH connection for $host failed"
   fi
done
$SHELL

파일 host은 다음과 같습니다.

~/keys/testuser1key testuser1@server1
~/keys/testuser2key testuser2@server2
~/keys/testuser3key testuser3@server3
...

다음과 같은 오류가 발생합니다.could not resolve hostname true

파일의 공백이 host스크립트를 손상시키는 것이라고 생각합니다. 비슷한 스크립트를 사용했는데 내 사용자 계정에서 "-i" ssh 플래그 없이 실행하는 데 아무런 문제가 없었습니다. ( ssh myuseraccount@testserver1)

더 나은 접근 방식에 대한 도움이나 제안을 주시면 감사하겠습니다!

답변1

while read암시적 분할+글로브 동작에 의존하기보다는 공백으로 구분된 토큰을 개별 변수에 할당할 수 있도록 루프를 사용하는 것이 좋습니다.$(cat hosts)

유일한 까다로운 부분은 read기본적으로 표준 입력에서도 읽는다는 것 입니다 ssh. 따라서 -nssh가 /dev/null에서 읽도록 지시하는 플래그를 전달해야 합니다 .

while read -r identityfile host; do
  if ssh -n -i "$identityfile" "$host" true
  then
    echo "SSH connection for $host ok"
  else
    echo "SSH connection for $host failed"
  fi
done < hosts

또는 read다른 파일 설명자에서 읽으라고 지시합니다.

while read -u3 -r identityfile host; do
  if ssh -i "$identityfile" "$host" true
  then
    echo "SSH connection for $host ok"
  else
    echo "SSH connection for $host failed"
  fi
done 3< hosts

~참고: $HOME호스트 파일의 ID 파일 부분에 접두사를 붙이는 대신 를 사용하면 작업이 좀 더 어려워집니다. 인용하면 "$identityfile"쉘이 물결표 확장을 방지하고 그대로 둡니다.연합 국가Quote(as )는 토큰화 및 파일 이름 생성을 $identityfile허용하므로 위험합니다 . 그것~인 것 같다최소한 OpenSSH 구현은 자체적으로 ssh확장 할 수 있지만 ~ssh 구현이 그렇지 않은 경우 이를 올바르게 처리하려면 추가 처리가 필요합니다.

1 이 경우 파일 이름 생성(와일드카드)이 주요 관심사입니다. 이름에 공백이 포함되어 있으면 전체 접근 방식에 결함이 있기 때문입니다.

관련 정보