使用I/O重定向的方式将命令列表提供给交互式程序,是标准输入的一种替代
命令 <<标记
...
...
标记
注意事项
实现简单的免交互
通过read命令接收输入并打印
[root@localhost ~]# vim do.sh
#!/bin/bash
#
read i <
发现只有第一行被打印了,因为一次交互只对应一行;
设置用户密码
[root@localhost ~]# vim do01.sh
#!/bin/bash
#
passwd tom <
生成一个指定内容的文件
[root@localhost ~]# vim do02.sh
#!/bin/bash
#
filename="none.txt"
dearname="衣羊"
cat > $filename <
变量一定要先定义,再调用,不然是会报错的
实现多行内容的赋值
[root@localhost ~]# vim do03.sh
#!/bin/bash
#
name=njit
myvar=$(cat <
[root@localhost ~]# ./do04.sh
please use the $name
[root@localhost ~]# vim do04.sh
#!/bin/bash
#
cat <<'EOF' ##使用单引号将前面的标记引起来,关闭变量替换
please use the $name
EOF
[root@localhost ~]# vim do05.sh
#!/bin/bash
#
cat <<-'EOF' ###-表示抑制行首的TAB
pelease remove
$kgc
EOF
[root@localhost ~]# ./do05.sh
pelease remove
$kgc
通过Here Document方式使Bash支持多行注释
语法格式
: <
多行注释,注释内容不会被执行
[root@localhost ~]# vim do06.sh
#!/bin/bash
: <
Expect是建立在tcl之上的一个工具,用于进行自动化控制和测试,解决shell脚本中交互相关的问题
yum -y install expect
spawn
expect
send
结束符
set
exp_continue
send_user
接收参数
为了方便可以set filename [lindex $argv 1],之后便可以调用变量filename来表示第一个参数
expect “password:” {send “123456\r”;}
expect “aaa” {send “AAA\r”;exp_continue} ##若是没有continue,一旦匹配上就不往下匹配了,会退出expect程序
expect “bbb” {send “BBB\r”}
远程登录
[root@localhost expect]# vim expect05.sh
#!/usr/bin/expect ###expect的路径
#
set timeout 10
log_file log.log
log_user 1
set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh root@$hostname
expect {
"connecting (yes/no)"
{send "yes\r";exp_continue}
"password"
{send "${password}\r";}
}
interact
[root@localhost expect]# ./expect05.sh 20.0.0.61 123456
spawn ssh [email protected]
[email protected]'s password:
Last login: Tue Jul 28 11:04:03 2020 from 20.0.0.100
[root@evil ~]#
远程登录后自动登出
[root@localhost expect]# !vim
vim expect07.sh
#!/bin/bash ###
#
hostname=$1
password=$2
/usr/bin/expect<<-EOF ###嵌入
spawn ssh root@$hostname
expect {
"(yes/no)"
{send "yes\r";exp_continue}
"password"
{send "${password}\r";}
}
expect "*]#"
send "exit\r"
expect eof
EOF
[root@localhost expect]# ./expect07.sh 20.0.0.61 123456
spawn ssh [email protected]
[email protected]'s password:
Last login: Tue Jul 28 11:06:44 2020 from 20.0.0.100
[root@evil ~]# exit
登出
Connection to 20.0.0.61 closed.
例1:创建用户并设置密码
[root@localhost expect]# vim expect08.sh
#!/bin/bash
#
username=$1
password=$2
useradd $1
/usr/bin/expect<<-EOF
spawn passwd $1
expect {
"新的 密码"
{send "$2\r";exp_continue}
"重新输入新的 密码"
{send "$2\r";}
}
EOF
[root@localhost expect]# ./expect08.sh wxy 123456
spawn passwd wxy
更改用户 wxy 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
例2:完成SSH登录过程
[root@localhost expect]# vim expect09.sh
#!/usr/bin/expect
#
set timeout 5
set hostname [lindex $argv 0]
set password [lindex $argv 1]
spawn ssh $hostname
expect {
"Connection refused" exit ##拒绝登录
"Name or server not known" exit ##
"to continue" {send "yes\r";exp_continue} ##正常登录
"password" {send "${password}\r";}
}
interact
exit
[root@localhost expect]# ./expect09.sh 20.0.0.61 123456
spawn ssh 20.0.0.61
[email protected]'s password:
Last login: Tue Jul 28 11:44:11 2020 from 20.0.0.100
[root@evil ~]#
例3:FTP登录
[root@localhost expect]# vim expect10.sh
#!/usr/bin/expect
#
set timeout 10
spawn ftp 20.0.0.61
expect "Name*"
send "ftp\r"
expect "Password:"
send "\r"
expect "ftp>"
interact
expect eof
[root@localhost expect]# ./expect10.sh
spawn ftp 20.0.0.61
Connected to 20.0.0.61 (20.0.0.61).
220 (vsFTPd 3.0.2)
Name (20.0.0.61:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
记得安装vsftp,启动服务,关闭防火墙