Shell脚本——与Linux Shell自动交互
2017-05-16 14:16
489 查看
自动交互的关键是交互信息的自动输入;
Shell将分界符delimiter之后直到下一个相同分界符之前的所有内容作为输入,遇到下一个分界符表示输入结束;
最常见的delimiter分界符是EOF,也可自定义为其他字符;
ftp -in 192.168.168.167 << EOF
user twc 829
cd /ITS/TOOL/download
ascii
hash
prompt
mput *
close
bye
EOF
详解如下:
(1)登录FTP服务器
① 方法1
ftp -in IP_ADDRESS << EOF
由于是ftp脚本,需要定一个结束符,建议使用EOF;
-i 关闭多个文件传输时的交互过程
-n 不适用ftp自动登录,ftp默认读取用户家目录下.netrc文件中的设定
-v 显示远程服务器的所有响应信息
② 方法2
ftp -in << EOF
open IP_ADDRESS
(2)user USER_NAME PASSWORD
ftp服务器登录的用户名和密码;
(3)查看FTP服务器上的文件
dir 查看远程服务器目录和文件列表,可与通配符*和?使用
ls 显示远程服务器简易的文件列表
cd 进入远程服务器指定目录,必须带目录名
(4)查看本地文件
ldir 查看本地目录和文件列表,可与通配符*和?使用
lls 显示本地简易的文件列表
lcd 进入本地指定目录
(5)传输类型
FTP传送方式有二:ascii是以ASCII码方式,binary是以二进制方式;
type 查看当前传输方式;
(6)下载、上传、删除文件
① 上传
put/mput FILENAME NEW_FILENAME
put 从本地的当前路径下将指定文件上传到FTP服务器;
mput 上传多个文件;
注:若不指定NEW_FILENAME,文件以原名上传;
②下载
get/mget FILENAME NEW_FILENAME
get 从FTP服务器的当前路径下将指定文件下载到本地;
mget 下载多个文件;
注:若不指定NEW_FILENAME,文件以原名下载;
③ 删除
delete 删除远程服务器中的指定文件;
mdelete 批量删除文件;
④ 切换交互式
prompt 关闭交互提示模式(默认交互提示),传输文件时不询问yes/no,常用于多文件传输;
⑤ 显示进度
hash 每传输1024个字节,显示一个hash符号#;
(7)结束
close 结束与FTP服务器的会话;
bye 结束与FTP服务器的会话,并退出FTP环境;
quit 结束与FTP服务器的会话,并退出FTP环境;
(8)EOF
脚本遇到EOF,ftp脚本执行结束;
使用“echo + sleep + |”来实现;
(echo "cur_passwd"
sleep 1
echo "new_passwd"
sleep 1
echo "new_passwd") | passwd
spawn su root
expect "password: "
send "12345678\r"
expect eof
exit
详解如下:
(1)安装expect包
yum -y install expect
(2)#!/bin/expect
expect安装路径,不清楚可使用“whereis expect”;
(3)set timeout 30
设置超时时间,单位为s;
(4)spawn su root
spawn是在expect环境中才可执行的expect内部命令,用于启动一个新的进程;
(5)expect "password: "
判断上次输出结果是否包含"password: "字符串,若是则执行expect紧跟的send语句;
(6)send "12345678\r"
expect和send搭配使用,当expect后接的字符串匹配,则send将后接信息发送给spawn启动的那个进程;
send_user 回显给用户的信息;
(7)interact
保持交互状态,把控制权交给控制台,此时可手工操作;
若无interact,则直接退出,而非留在远程终端上;
(8)expect脚本执行
若expect脚本文件名为install.sh,则执行该文件使用“expect install.sh”或“./install.sh”;
(9)并列表达式
expect脚本顺序执行,当程序执行到某个expect时会发生阻塞,程序一直等到timeout才退出;
并列表达式{}相当于switch,只要列出的几项内容中有一项符合,则expect命令符合,程序可正常执行;
如连接ftp时,发生超时则退出,否则发现Connect,说明服务器正常,可继续执行;
#!/bin/expect
spawn ftp 202.199.248.25
expect{
timeout{
send_user "connect timeout!"
exit
}
"Connect"
}
send_user "connect succeed!"
... ...
注:缺点是需要安装expect,平台通用性不高,较麻烦;
一、自动交互方法一——重定向
1 需求
从一台Linux机器ftp登录到另一台Linux机器,进行系列操作后关闭;2 自动交互方法
使用“command << delimiter”,从标准输入中读入,直到遇到delimiter分界符;Shell将分界符delimiter之后直到下一个相同分界符之前的所有内容作为输入,遇到下一个分界符表示输入结束;
最常见的delimiter分界符是EOF,也可自定义为其他字符;
3 自动交互实现
#!/bin/bashftp -in 192.168.168.167 << EOF
user twc 829
cd /ITS/TOOL/download
ascii
hash
prompt
mput *
close
bye
EOF
详解如下:
(1)登录FTP服务器
① 方法1
ftp -in IP_ADDRESS << EOF
由于是ftp脚本,需要定一个结束符,建议使用EOF;
-i 关闭多个文件传输时的交互过程
-n 不适用ftp自动登录,ftp默认读取用户家目录下.netrc文件中的设定
-v 显示远程服务器的所有响应信息
② 方法2
ftp -in << EOF
open IP_ADDRESS
(2)user USER_NAME PASSWORD
ftp服务器登录的用户名和密码;
(3)查看FTP服务器上的文件
dir 查看远程服务器目录和文件列表,可与通配符*和?使用
ls 显示远程服务器简易的文件列表
cd 进入远程服务器指定目录,必须带目录名
(4)查看本地文件
ldir 查看本地目录和文件列表,可与通配符*和?使用
lls 显示本地简易的文件列表
lcd 进入本地指定目录
(5)传输类型
FTP传送方式有二:ascii是以ASCII码方式,binary是以二进制方式;
type 查看当前传输方式;
(6)下载、上传、删除文件
① 上传
put/mput FILENAME NEW_FILENAME
put 从本地的当前路径下将指定文件上传到FTP服务器;
mput 上传多个文件;
注:若不指定NEW_FILENAME,文件以原名上传;
②下载
get/mget FILENAME NEW_FILENAME
get 从FTP服务器的当前路径下将指定文件下载到本地;
mget 下载多个文件;
注:若不指定NEW_FILENAME,文件以原名下载;
③ 删除
delete 删除远程服务器中的指定文件;
mdelete 批量删除文件;
④ 切换交互式
prompt 关闭交互提示模式(默认交互提示),传输文件时不询问yes/no,常用于多文件传输;
⑤ 显示进度
hash 每传输1024个字节,显示一个hash符号#;
(7)结束
close 结束与FTP服务器的会话;
bye 结束与FTP服务器的会话,并退出FTP环境;
quit 结束与FTP服务器的会话,并退出FTP环境;
(8)EOF
脚本遇到EOF,ftp脚本执行结束;
二、自动交互交互方法二——管道
1 需求
修改登录密码;2 自动交互方法
采用非交互式修改用户密码,方法一无法实现;使用“echo + sleep + |”来实现;
3 自动交互实现
#!/bin/bash(echo "cur_passwd"
sleep 1
echo "new_passwd"
sleep 1
echo "new_passwd") | passwd
三、自动交互方法三——expect
1 需求
希望su自动登录到root用户;.2 自动交互方法
Shell工具expect专门实现自动交互;3 自动交互实现
#!/bin/expectspawn su root
expect "password: "
send "12345678\r"
expect eof
exit
详解如下:
(1)安装expect包
yum -y install expect
(2)#!/bin/expect
expect安装路径,不清楚可使用“whereis expect”;
(3)set timeout 30
设置超时时间,单位为s;
(4)spawn su root
spawn是在expect环境中才可执行的expect内部命令,用于启动一个新的进程;
(5)expect "password: "
判断上次输出结果是否包含"password: "字符串,若是则执行expect紧跟的send语句;
(6)send "12345678\r"
expect和send搭配使用,当expect后接的字符串匹配,则send将后接信息发送给spawn启动的那个进程;
send_user 回显给用户的信息;
(7)interact
保持交互状态,把控制权交给控制台,此时可手工操作;
若无interact,则直接退出,而非留在远程终端上;
(8)expect脚本执行
若expect脚本文件名为install.sh,则执行该文件使用“expect install.sh”或“./install.sh”;
(9)并列表达式
expect脚本顺序执行,当程序执行到某个expect时会发生阻塞,程序一直等到timeout才退出;
并列表达式{}相当于switch,只要列出的几项内容中有一项符合,则expect命令符合,程序可正常执行;
如连接ftp时,发生超时则退出,否则发现Connect,说明服务器正常,可继续执行;
#!/bin/expect
spawn ftp 202.199.248.25
expect{
timeout{
send_user "connect timeout!"
exit
}
"Connect"
}
send_user "connect succeed!"
... ...
注:缺点是需要安装expect,平台通用性不高,较麻烦;
相关文章推荐
- shell脚本实现无密码交互的SSH自动登陆
- linux - 怎么自动填写有交互的shell脚本 - SegmentFault
- shell脚本实现无密码交互的SSH自动登陆
- Shell脚本交互之:自动输入密码
- shell脚本实现无密码交互的SSH自动登陆
- Shell脚本交互之:自动输入密码
- shell脚本实现无密码交互的SSH自动登陆
- linux - 怎么自动填写有交互的shell脚本 - SegmentFault
- shell脚本实现无密码交互的SSH自动登陆
- linux - 怎么自动填写有交互的shell脚本 - SegmentFault
- shell脚本调用expect命令实现命令行自动交互
- shell自动交互之expect脚本_转
- Linux-----Shell脚本交互实现自动输入密码
- linux - 怎么自动填写有交互的shell脚本 - SegmentFault
- Shell脚本交互之:自动输入密码【转】
- shell脚本实现无密码交互的SSH自动登陆
- Linux Shell脚本实现自动交互
- linux - 怎么自动填写有交互的shell脚本 - SegmentFault
- 用expect实现shell脚本的自动交互
- shell脚本调用expect命令实现命令行自动交互