自动交互的方法

自动交互的方法呢主要有四种。我主要讲一下第四种,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 [email protected]
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 [email protected]:/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来实现比较方便些,也比较简单。遵循以上格式就可以。

猜你喜欢

转载自blog.csdn.net/qq_42935487/article/details/88113774