해당 테스트 사용자 계정 집합을 사용하여 호스트 집합에 대한 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
. 따라서 -n
ssh가 /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 이 경우 파일 이름 생성(와일드카드)이 주요 관심사입니다. 이름에 공백이 포함되어 있으면 전체 접근 방식에 결함이 있기 때문입니다.