首先安装 expectexpectexpect,因为默认是没有安装这个的,UbuntuUbuntuUbuntu 系统可以直接通过 sudo apt−get install expectsudo\ apt-get\ install\ expectsudo apt−get install expect 来安装,然后写好 expectexpectexpect 脚本,假如说叫做 login−via−sshlogin-via-sshlogin−via−ssh,如果脚本没有参数的话,直接 expect login−via−sshexpect\ login-via-sshexpect login−via−ssh 就可以了,注意必须用 expectexpectexpect 来运行这个脚本,其他 shellshellshell 工具是无法解析这个脚本的。
不过我这里写的 login−via−sshlogin-via-sshlogin−via−ssh 脚本有一些参数:
Usage: expect login-via-ssh username password hostname realip script
主要功能是通过 sshsshssh 链接到用户名为 usernameusernameusername,密码为 passwordpasswordpassword 的服务器,服务器的主机名叫做 hostnamehostnamehostname,真实的 IPIPIP 地址为 realiprealiprealip,链接到这个服务器后执行 scriptscriptscript 脚本。
#!/usr/bin/expect -f
set timeout 10
set username [lindex $argv 0]
set password [lindex $argv 1]
set hostname [lindex $argv 2]
set realip [lindex $argv 3]
set script [lindex $argv 4]
spawn ssh -l $username $realip "echo '$password' | sudo -S ~/$script $hostname"
expect {
"(yes/no)?" {
send "yes\n"
expect "password:"
send "$password\n"
}
"password:" {
send "$password\n"
}
}
interact
这里用来实现自动输入的是 expectexpectexpect 部分,当检测到 (yes/no)?(yes/no)?(yes/no)? 的时候,会自动输入 yesyesyes,检测到 password:password:password: 时会自动输入 passwordpasswordpassword。
另外,spawnspawnspawn 后双引号里的内容,是要在 sshsshssh 远程链接到的服务器上执行的,因为 sudosudosudo 权限需要键入密码,所以通过 echoechoecho 的方式来进行自动输入密码。
说到这里,就不得不说的是,常见的自动输入密码的方法有三种,但是对于 sshsshssh 和 scpscpscp 这种命令只能通过 expectexpectexpect 来进行自动输入密码的操作。
xscpxscpxscp 脚本:
#!/usr/bin/expect -f
# Usage: expect xscp a b c
set timeout 10
set source [lindex $argv 0]
set target [lindex $argv 1]
set passwd [lindex $argv 2]
spawn scp $source $target
expect {
"(yes/no)?" {
send "yes\n"
expect "password:"
send "$passwd\n"
}
"password:" {
send "$passwd\n"
}
}
interact