!/usr/bin/기대

!/usr/bin/기대

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"를 사용하는 방법을 모르겠습니다. 나는 성공하지 않고 이것을 시도했습니다.

관련 정보