내 목표는 CSV 파일의 서버 목록에 대해 로그인이 성공했는지 확인하는 것입니다. SSH 비밀번호, 사용자 ID, IP 주소의 경우 CSV를 통해 해당 값을 전달합니다.
SSH 로그인이 성공할 때마다 SSH 연결의 출력을 캡처하려고 합니다.
이를 위해 쉘 스크립트를 작성했지만 CSV의 첫 번째 데이터 세트에 대한 성공적인 로그인 출력만 표시됩니다. 나머지 서버의 경우 SSH 명령이 실패합니다.
스크립트:
#!/bin/sh
INPUT=Test_data.csv
OLDIFS=$IFS
IFS=","
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }
while read ip user pass
do
sshpass -p $pass ssh -n -t -t -o "StrictHostKeyChecking no" $user@$ip >> output.txt
wait
exit
done < $INPUT
IFS=$OLDIFS
산출:
Welcome to CYBER SECURITY
Cisco Codec Release ce 9.12.3 140cd8212ba 2020-04-17
SW Release Date: 2020-04-17
*r Login successful
OK
^[[?1034h10.xx.xx.xx,admin,432584
Command not recognized.
10.xx.xx.xx,admin,432584
Command not recognized.
10.xx.xx.xx,admin,432584
Command not recognized.
10.xx.xx.xx,admin,432584
Command not recognized.
답변1
간단히 말해서: SSH 쉘 스크립트확실히예상대로 작동하면 스크립트가 중단될 수 있습니다.
무슨 일이 일어나고 있는지는 분명합니다. "첫 번째" SSH 연결이 설정되고 그 시점부터 모든 것이 stdin
SSH 연결로 전송됩니다. Cisco는 CSV 행의 "명령"으로 무엇을 해야 할지 모릅니다.
ssh
맨페이지 에서 :
SYNOPSIS
ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface] [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11] [-i identity_file] [-J destination] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-Q query_option] [-R address]
[-S ctl_path] [-W host:port] [-w local_tun[:remote_tun]] destination [command]
이것이 [command]
핵심입니다. 링크 반대편에서 무언가를 자동화하려면 이를 지정해야 합니다.동일한 명령줄에서ssh
아니면 명령의 일부가 아닙니다 . 스크립트에서는 절대 호출되지 않습니다 wait
.exit
줄을 다음으로 변경해 보세요.
sshpass -p $pass ssh -n -t -t -o "StrictHostKeyChecking no" $user@$ip 'wait; exit' >> output.txt
이것이 작동하는지 확인하십시오. 솔직히 말해서 다음과 같이 설정하는 것이 좋습니다.안시푸르대신 재고를 사용하면 많은 문제를 해결할 수 있습니다. 그러면 실행하여 ansible -m ping ciscos
멋진 요약을 얻을 수 있기 때문입니다.