English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
배경
리눅스 스크립트에서는 많은 상황에서 원격 작업이 수행됩니다. 예를 들어 원격 로그인 ssh, 원격 복사 scp, 파일 전송 sftp 등입니다. 이러한 명령어들은 모두 보안 비밀번호 입력에 관련이 있으며, 명령어를 일반적으로 사용할 때는 비밀번호를 수동으로 입력하고 보안 인증을 받아야 합니다. 원격 작업을 자동화하기 위해 expect 기능을 활용할 수 있습니다.
expect는 무료 프로그래밍 툴 언어로, 자동 및 상호작용 작업을 통한 통신을 수행하고, 인간의 개입 없이도 사용할 수 있습니다. expect는 지속적으로 발전하고 있으며, 시간이 지남에 따라 기능이 더욱 강화되어, 시스템 관리자의 강력한 도구로 자리 잡고 있습니다. expect는 Tcl 프로그래밍 언어의 지원이 필요하며, 시스템에서 expect를 실행하려면 먼저 Tcl을 설치해야 합니다.
expect 설치
expect는 Tcl 기반으로 만들어졌기 때문에, expect를 설치하기 전에 먼저 Tcl을 설치해야 합니다.
(1) Tcl 설치
홈페이지: http://www.tcl.tk
다운로드 주소: http://www.tcl.tk/소프트웨어/tcltk/downloadnow84.tml
1. 소스 코드 패키지 다운로드
wget http://nchc.dl.sourceforge.net/sourceforge/tcl/tcl8.4.11-src.tar.gz
2. 소스 코드 패키지 압축 해제
tar xfvz tcl8.4.11-src.tar.gz
3. 설치 구성
cd tcl8.4.11/unix ./configure --prefix=/usr/tcl --enable-shared make make install
주의:
1、설치가 완료되면, tcl 소스 코드의 루트 디렉토리에 진입하여 unix 하위 디렉토리의 tclUnixPort.h를 generic 디렉토리로 복사합니다.
2、expect 설치 과정에서도 사용할 필요가 있으므로, tcl 소스 코드를 잠시 제거하지 마세요.
(2) expect 설치 (Tcl 라이브러리 필요)
홈페이지: http://expect.nist.gov/
1. 소스 코드 패키지 다운로드
wget http://sourceforge.net/프로젝트/expect/파일/Expect/5.45/expect5.45.tar.gz/download
2. 소스 코드 패키지 압축 해제
tar xzvf expect5.45.tar.gz
3. 설치 구성
cd expect5.45 ./configure --prefix=/usr/expect --with-tcl=/usr/tcl/lib --with-tclinclude=../tcl8.4.11/generic make make install ln -s /usr/tcl/bin/expect /usr/expect/bin/expect
expect
expect의 핵심은 spawn, expect, send, set입니다.
spawn 실행할 명령 호출
expect 스크립트는 interact나 expect eof로 끝내야 합니다. 자동화 작업을 수행할 때는 일반적으로 expect eof만 충분합니다.
기타 설정
expect 작성 문법
expect는 tcl 문법을 사용합니다
예제
login.exp는 원격 로그인에 사용되며, 빠른 사용 방법: login.exp "exclude" "${remote_ip}" "${remote_user}" "${remote_passwd}" "${remote_command}"
#!/usr/bin/expect -f ########################################################## # SSH를 통해 로그인하고 명령어 실행 # 파라미터:1.Use_Type [check/execute] # 2.SSHServerIp # 3.SSHUser # 4.SSHPassword # 5.CommandList [명령어 사이에 ;로 구분] # 반환 값: # 0 성공 # 1 파라미터 개수가 올바르지 않습니다 # 2 SSH 서버 서비스가 열려 있지 않습니다 # 3 SSH 사용자 비밀번호가 정확하지 않습니다 # 4 SSH 서버 연결 시간 초과 ########################################################## proc usage {} {} regsub ".*/" $::argv0 "" name send_user "Usage:\n" send_user " $name Use_Type SSHServerIp SSHUser SSHPassword CommandList\n" exit 1 } ## 파라미터 개수�断정 if {[llength $argv] != 5} usage } #변수 값을 설정합니다 set Use_Type [lindex $argv 0] set SSHServerIp [lindex $argv 1] set SSHUser [lindex $argv 2] set SSHPassword [lindex $argv 3] set CommandList [lindex $argv 4] #spawn ping ${SSHServerIp} -w 5 #expect { # -nocase -re ""100% 패킷 손실" { # send_error "Ping ${SSHServerIp}는 접근할 수 없습니다. IP 주소를 확인하십시오.\n" # exit 1 # } #} set timeout 360 set resssh 0 #ssh 연결할 때 yes를 입력하는지 여부를 표시하는 변수 정의 set inputYes 0 set ok_string LOGIN_SUCCESS if {$Use_Type=="check"} { #ssh 연결을 활성화하려면 필요한 경우 yes를 입력하십시오. inputYes를 설정하십시오1، 그렇지 않으면 ssh 비밀번호를 입력하십시오 spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string" } else { spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList" } expect { -nocase -re "yes"/no" { send -- "yes\n" set inputYes 1 } -nocase -re "assword: " { send -- "${SSHPassword}\n" set resssh 1 } #-nocase -re "마지막 로그인: " { # send -- "${CommandList}\n" #} $ok_string {} -nocase -re "연결 거부" send_error "SSH 서비스 ${SSHServerIp}에서 활성화되지 않음.\n" exit 2 } timeout {}}} send_error "Connect to SSH server ${SSHUser}@${SSHServerIp} timeout(10s).\n" exit 4 } } #yes를 확인하면, ssh 비밀번호를 입력합니다. if {$inputYes==1} expect { -nocase -re "assword: " { send -- "${SSHPassword}\n" set resssh 1 } } } #try again 또는 password: 표시가 나타나면, 입력한 사용자 비밀번호가 오류입니다. 즉시 종료됩니다. if {$resssh==1} expect { -nocase -re "try again" { send_error "SSH user:${SSHUser} passwd error.\n" exit 3 } -nocase -re "assword:" { send_error "SSH user:${SSHUser} passwd error.\n" exit 3 } eof {} } } send_error -- "$expect_out(buffer)" #-nocase -re "No such user" { # send_error "No such user.\n" # exit 5 # } #exit
정리
이 글의 모든 내용이 끝납니다. 이 글의 내용이 여러분의 학습이나 업무에 도움이 되길 바랍니다. 의문이 있으시면 댓글을 통해 교류해 주시기 바랍니다. 감사합니다.呐喊 튜토리얼에 대한 여러분의 지원에 감사합니다.
고지: 본 문서의 내용은 인터넷에서 가져왔으며, 저작권은 원작자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 사이트는 소유권을 가지지 않으며, 인공 편집을 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있을 경우, 이메일을 notice#w로 보내 주시기 바랍니다.3codebox.com(보고할 때는 #을 @으로 변경하십시오. 관련 증거를 제공하시면, 확인된 후 해당 사이트는 즉시 저작권 침해 내용을 삭제합니다.