用expect命令实现Shell的自动化交互
背景linux脚本中有很多场景是进行远程操作的,例如远程登录ssh、远程复制scp、文件传输sftp等。这些命令中都会涉及到安全密码的输入,正常使用命令时是需要人工手动输入密码并接受安全验证的。为了实现自动化远程操作,我们可以借用expect的功能。 expectexpect的核心是spawn、expect、send、set。 spawn 调用要执行的命令
其他设置
expect编写语法
示例login.exp专用于远程登录,快捷使用方式: #!/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 CommandListn" 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% packet loss" { # send_error "Ping ${SSHServerIp} is unreachable,Please check the IP address.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确认,输入yes,设置inputYes为1,否则输入ssh密码 spawn ssh ${SSHUser}@${SSHServerIp} "echo $ok_string" } else { spawn ssh ${SSHUser}@${SSHServerIp} "$CommandList" } expect { -nocase -re "yes/no" { send -- "yesn" set inputYes 1 } -nocase -re "assword: " { send -- "${SSHPassword}n" set resssh 1 } #-nocase -re "Last login: " { # send -- "${CommandList}n" #} $ok_string {} -nocase -re "Connection refused" { send_error "SSH services at ${SSHServerIp} is not active.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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |