自动交互的方法呢主要有四种。我主要讲一下第四种,expect。
1.查看命令,看看有没有选项用来实现自动交互的。
eg:
[root@rhel1 ~]# echo "abc" | passwd --stdin u1
Changing password for user u1.
passwd: all authentication tokens updated successfully.
2.输入重定向
eg:
[root@rhel1 ~]# passwd u1 < /tmp/p.txt
Changing password for user u1.
New password: BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password: passwd: all authentication tokens updated successfully.
3.here document
eg:
[root@rhel1 ~]# passwd u1 << eof
> 123
> 123
> eof
Changing password for user u1.
New password: BAD PASSWORD: it is WAY too short
BAD PASSWORD: is too simple
Retype new password: passwd: all authentication tokens updated successfully.
4.用expect来实现
首先需要安装expect, (我稍稍的提下如何安装吧)
挂载挂盘后进入挂载目录,进入Packages目录进行安装
先解决依赖关系。
[root@rhel1 Packages]# rpm -ivh expect-5.44.1.15-5.el6_4.x86_64.rpm
warning: expect-5.44.1.15-5.el6_4.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
error: Failed dependencies:
libtcl8.5.so()(64bit) is needed by expect-5.44.1.15-5.el6_4.x86_64
[root@rhel1 Packages]# rpm -ivh expect-5.44.1.15-5.el6_4.x86_64.rpm tcl-devel-8.5.7-6.el6.x86_64.rpm tcl-8.5.7-6.el6.x86_64.rpm
warning: expect-5.44.1.15-5.el6_4.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing... ########################################### [100%]
1:tcl ########################################### [ 33%]
2:expect ########################################### [ 67%]
3:tcl-devel ########################################### [100%]
安装好之后我先介绍下expect的内部命令:
spawn: 后面加上需要执行的shell命令,比如说spawn ssh root@172.16.1.1
expect: 只有spawn 执行的命令结果才会被expect 捕捉到,因为spawn 会启动一个进程,
只有这个进程的相关信息才会被捕捉到。
send:send 会将expect 脚本中需要的信息发送给spawn 启动的那个进程
send_user: 只在屏幕显示,不送给spawn 启动的那个进程,相当于echo
如果在脚本中嵌套expect代码,就要使用expect -c “expect代码”
eg:
expect -c "
#登录$ip_addr执行df -P 命令
spawn ssh $user_name@$ip_addr df -P
expect {
\"*(yes/no)?\" {send \"yes\r\" ; exp_continue}
\"*password:\" {send \"$user_pwd\r\" ; exp_continue}
}
#运行机器(也就是说执行脚本的机器)把 172.16.4.4主机中的/opt/scripts/check.sh下载到运行机器/opt/scripts目录下
spawn scp root@172.16.4.4:/opt/scripts/check.sh /opt/scripts
expect {
\"(yes/no)?\" {send \"yes\r\";exp_continue}
#这个密码是主机172.16.4.4的密码
\"password:\" {send \"123456\r\";exp_continue}
}
#把运行机器的check.sh脚本发送到其他机器
spawn scp /opt/scripts/check.sh root@${ip_addr}:/opt/scripts
expect {
\"*(yes/no)?\" {send \"yes\r\" ; exp_continue}
\"*password:\" {send \"$user_pwd\r\" ; exp_continue}
}
"
这样就可以实现自动交互。通常用expect来实现比较方便些,也比较简单。遵循以上格式就可以。