这是本人接触Linux中,接触到的几种自动交互的方法,本人小白一枚,有不足之处请多多指教
1、查找帮助,通过管道等工具实现自动交互
举一个比较简单的例子,当我们给用户设置密码时,这时就涉及到了自动交互
这时我们可以通过管道符和一些命令来避免交互

[root@S1 ~]# echo "123" | passwd --stdin u1

这也是比较简单的方法
2、输入重定向
还是以给用户设置密码为例

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

[root@S1 ~]# 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.

其中eof为结束标志,表示你要输入的内容碰到eof(可以用任意的字符代替它)就要停止输入(注意最后一行的eof后面不要有空格,否则识别不到)
4、用expect来实现
首先我们先安装exoect工具

[root@S1 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/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
   1:tcl                    ########################################### [ 33%]
   2:expect                 ########################################### [ 67%]
   3:tcl-devel              ########################################### [100%]

我们可以通过expect完成自动交互的任务

首先,先将以下expect的内部命令:
spawn: 后面加上需要执行的shell命令,比如说spawn ssh root@172.16.1.1
expect: 只有spawn 执行的命令结果才会被expect 捕捉到,因为spawn 会启动一个进程,只有这个进程的相关信息才会被捕捉到。
send:send 会将expect 脚本中需要的信息发送给spawn 启动的那个进程
send_user: 只在屏幕显示,不送给spawn 启动的那个进程,相当于echo

我们通过expect来捕捉交互时屏幕上输出的交互信息

如果需要在shell脚本中嵌套expect代码,就要使用expect -c "expect代码"
例如:

expect -c "
        spawn ssh $user_name@$ip_addr df -P     #这里是提前定义好的两个变量
        expect {
            \"*(yes/no)?\" {send \"yes\r\" ; exp_continue}     #这两行为捕捉到的信息
            \"*password:\" {send \"$user_pwd\r\" ; exp_continue}
        }
    "

总结:
自动交互的方法:
1、查找帮助,看有没有选项实现自动交互
2、用输入重定向能不能实现
3、用here document能不能实现
4、用expect能不能实现

Logo

更多推荐