Centos 7이 설치된 PC에서 실행되고 SSH를 사용하여 Centos 7이 설치된 다른 PC에 연결하고 "ls -la"와 같은 콘솔 명령을 실행하고 그 출력을 파일에 저장하는 스크립트를 작성해야 합니다. 나중에 출력하세요.
나는 다음과 같은 EXPECT 스크립트를 작성했습니다:
ssh_connection.exp:
#!/usr/bin/expect -f
set timeout 120
spawn ssh [email protected]
expect "assword:"
send "PASSWORD\r"
expect "prompt#"
sleep 5
puts "Executing ls -la"
send "ls -la\r"
sleep 10
puts "Executing ps -af"
puts "ps -af\r"
sleep 10
puts "Closing the ssh session\r"
send "exit\r"
스크립트는 ssh를 통해 IP = 129.0.0.10인 컴퓨터에 올바르게 연결하고 "puts"에 나타나는 화면에 메시지를 표시합니다. ls -la 실행 ps -af 실행 ssh 세션 닫기
그러나 send로 보낸 명령을 실행한 결과는 표시되지 않습니다.
ls -la
ps -af
이 스크립트에 어떤 문제가 있나요?
나중에 bash 스크립트나 C 프로그램을 사용하여 분석할 수 있도록 이전 명령의 출력을 파일에 저장하려면 어떻게 해야 합니까?
답변1
expect
를 사용할 필요가 없습니다 . 이 ssh
명령은 SSH 연결을 통해 실행하려는 명령에 추가 인수를 사용할 수 있습니다.
1 단계
SSH 키 쌍(google it)을 설정하고 SSH 키를 원격 서버에 복사합니다. 이를 위해 ssh-copy-id
다음 U&L Q&A에 대한 답변을 참조하세요.SSH를 사용하여 연결할 수 있도록 원격 서버의 개인 키를 로컬 컴퓨터로 올바르게 복사하려면 어떻게 해야 합니까?.
2 단계
이제 키를 사용하여 서버에 SSH로 연결하는 기능을 사용하면 위의 문제는 다음과 같습니다.
$ ssh [email protected] "ls -la; ps -af"
좋아요를 누르고 이용하시면 됩니다여기에 있는 문서(heredocs, 일명 .here-docs)이 기술을 더욱 강화해 보세요.
$ ssh [email protected] <<EOF
> ls -la
> ps -af
> EOF
또는 명령을 파일에 넣고 다음으로 전달하십시오 ssh
.
$ ssh [email protected] < my.cmds
답변2
감사해요,
스크립트를 수정하고 다음 줄을 바꿨습니다.
SSH 생성[이메일 보호됨]
당신이 나에게 말했듯이 :
SSH 생성[이메일 보호됨]"ls -la; ps -af"
이제 화면에 명령 출력이 표시되고 파일로 리디렉션할 수 있습니다.
다음으로 Cisco와 유사한 스위치(Cisco는 아니지만 호환 가능)를 사용하여 다른 시스템에서 명령을 실행하도록 이 스크립트를 수정해 보았습니다.
SSH를 사용하여 스위치에 연결하는 스크립트는 다음과 같습니다.
**#!/usr/bin/expect -f
시간 초과 설정 120
SSH 생성[이메일 보호됨]"VLAN 500 표시"
"비밀번호:"가 필요합니다.
"비밀번호\r" 보내기
"프롬프트#"을 기대합니다
수면 5
"ssh 세션 닫기\r"를 입력하세요.
"종료\r" 보내기**
>
스위치에서는 작동하지 않습니다. 다음 오류가 발생합니다.
SSH 생성[이메일 보호됨]VLAN 501 표시
[이메일 보호됨]비밀번호:
imish: 잘못된 옵션 - 'c'
자세한 내용은 "imish --help"를 사용해 보십시오.
보내기: 생성 ID exp6이 열리지 않았습니다.
while executing
""종료\r" 보내기"
(file "./ssh_script_v3.exp" line 7)
>
따라서 명령을 보내기 위해 "send"를 사용하는 Expect 스크립트를 사용해야 합니다.
!/usr/bin/기대
SSH 생성[이메일 보호됨]
"비밀번호:"가 필요합니다.
"사용자\r" 보내기
기대됩니다>”
수면 5
"sh vlan 500\r" 보내기
수면 5
"종료\r" 보내기
>
이제 오류는 발생하지 않지만 화면에는 아무것도 표시되지 않습니다.
Linux 및 UNIX 시스템이 비대화형으로 실행될 때 출력을 자동으로 버퍼링하기 때문에 이런 일이 발생한다는 것을 읽었습니다. 내 생각에는 Expect가 "unbuffer"를 사용하여 프로그램이 대화형으로 실행되고 있다고 생각하게 만들 수 있다고 생각하지만 "send"와 함께 "unbuffer"를 사용하는 방법을 모르겠습니다. 나는 성공하지 않고 이것을 시도했습니다.