cmd << delimiter # << 可以替换为 <<- , delimiter 也可以加上单引号来使用;
Here Document Content
delimiter #此处的delimiter不能有任何其他字符;
其中,要注意如下知识点:
使用expect 命令来解决自动交互问题是非常广泛的,expect有自己独特的语法,可以写expect脚本来解决复杂的交互问题;但是很多时候,我们会需要在shell中通过调用expect脚本来解决交互问题;这时候就需要Here Documents 来帮忙; 在expect使用的时候,需要注意如下几点:
expect ... send ... 的语法结构使用的坑,对于下面的语法结构,有时候send命令并没有成功的执行,这是因为spawn产生的子进程而并不知道send已经结束 expect ... send ... 更好的写法是: expect ... send ... expect ... 也正是这个原因,所以expect一般在最后都会使用如下的结构: expect eof 看如下的例子:
[root@localhost ~]# cat 1.sh
#!/bin/bash
for i in `cat ./t.txt`
do echo "===========Password change for ID: $i================="
expect <<-EOF
spawn passwd $i
expect "assword:"
send "$1\n"
expect "assword:"
send "$1\n" #在这里密码并没有send ;
exit
EOF
done
#运行上述脚本得到的结果如下:并没有成功修改密码
[root@localhost ~]# bash 1.sh testpwd
===========Password change for ID: root=================
spawn passwd root
Changing password for user root.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: [root@localhost ~]#
重新修改代码,加上 expect eof 语句, 结果如下:
[root@localhost ~]# cat 1.sh
#!/bin/bash
for i in `cat ./t.txt`
do echo "===========Password change for ID: $i================="
expect <<-EOF
spawn passwd $i
expect "assword:"
send "$1\n"
expect "assword:"
send "$1\n"
expect eof
exit
EOF
done
#如下的运行结果成功修改了密码
[root@localhost ~]# bash 1.sh testpwd
===========Password change for ID: root=================
spawn passwd root
Changing password for user root.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
本文原创,转载请注明出处