내 임무는 약 300개의 장치에 로그인하고, 다음 명령을 실행하고, 출력을 파일에 복사하는 것입니다.
SSH를 로그인 방법으로 사용할 수 있으며 사전 정의된 사용자 이름과 비밀번호를 제공할 수 있습니다.
장치를 사용하면 전문가 모드에 로그인하고 사전 정의된 비밀번호를 제공해야 합니다.
$ expert
>>> provide password
$ lspci | egrep -i --color 'network|ethernet'
출력을 파일로 복사
다음 스크립트를 준비했습니다.
#!/bin/bash
username=XXXX
passwd=XXX
cd /tmp
for host in `cat servers.txt`;
do
ssh $username@$host $passwd;
expert
echo "### $host ###" >> output.txt
lspci | egrep -i --color 'network|ethernet' >> output.txt
done
비밀번호를 묻는 메시지가 표시되면 다음이 제공됩니다.
Running commands is not allowed
./fibertest.sh: line 9: expert: command not found
명령을 원격으로 실행하는 것이 아니라 로컬 컴퓨터에서 실행하는 것 같습니다.
답변1
당신은 줄 수 있습니다pssh(병렬 SSH라고도 함)한번 사용해 보세요. 여러 컴퓨터에서 명령을 실행하고 로컬 폴더에서 결과/출력을 가져옵니다.
답변2
Expect를 사용해 보시기 바랍니다. Expect는 원격 시스템과 상호 작용하는 목적(그러나 실제로는 원격 명령 및 출력 구문 분석과 같은 것과 상호 작용하는 등)을 위해 만들어진 tcl 기반 언어입니다.
매우 간단한 기대 스크립트를 작성하고 많은 것을 성취할 수 있습니다. 시도 해봐. Perl 및 Python용 모듈도 있으므로 해당 언어로 스크립트를 작성하고 싶다면 그렇게 할 수 있습니다.
다음은 Expect에 대한 정말 좋은 튜토리얼 목록입니다.http://wiki.tcl.tk/11584
저는 Expect를 사용하여 약 40개의 서버, 다양한 관리 작업, 정의된 간격으로 명령 출력 수집 등을 관리하고 있습니다.
예를 들어, 귀하의 컴퓨터가 SSH 키 인증을 사용하지 않고 sshpass와 같은 프로그램을 사용하고 싶지 않지만 여전히 스크립트를 통해(사람의 상호 작용 없이 자동으로) 로그인할 수 있기를 원하는 경우에 좋습니다. 이것은 단지 예일 뿐이지만 Expect는 그보다 훨씬 강력합니다.
답변3
SSH를 사용하여 서버에서 명령을 실행하려면 SSH 명령과 동일한 줄에 명령을 입력해야 합니다.
예
편집: 잠시 생각한 후에 서버가 이를 명령으로 실행하려고 시도하므로 ssh 명령에서 $password를 제거했습니다. 비밀번호를 얻으려면 SSH 키를 설정하거나 이를 Expect 스크립트와 결합해야 합니다.
ssh $username@$host "expert; echo \"### $host ###\" >> output.txt; lspci | egrep -i --color 'network|ethernet' >> output.txt; scp output.txt $ADMIN_SERVER:$host-output.txt"
cat *-output.txt > output.txt
이 코드 줄은 약간 길지만 명령을 따옴표로 묶고 세미콜론으로 구분하기만 하면 됩니다. 이때 내부 명령에 사용된 따옴표를 이스케이프 처리해야 합니다. 또한 스크립트 양식을 실행할 때마다 출력 파일을 관리 서버로 다시 복사한 다음 모두 연결해야 한다는 점을 명심하세요.