在Linux中实现自动交互(管道操作符,输入重定向,here document,expect)
这是本人接触Linux中,接触到的几种自动交互的方法,本人小白一枚,有不足之处请多多指教1、查找帮助,通过管道等工具实现自动交互举一个比较简单的例子,当我们给用户设置密码时,这时就涉及到了自动交互这时我们可以通过管道符和一些命令来避免交互[root@S1 ~]# echo “123” | passwd --stdin u1这也是比较简单的方法2、输入重定向还是以给用户设置密码为例p...
这是本人接触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能不能实现
更多推荐
所有评论(0)