Shell脚本——与Linux Shell自动交互
Posted twc829
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell脚本——与Linux Shell自动交互相关的知识,希望对你有一定的参考价值。
自动交互的关键是交互信息的自动输入;
一、自动交互方法一——重定向
1 需求
从一台Linux机器ftp登录到另一台Linux机器,进行系列操作后关闭;
2 自动交互方法
使用“command << delimiter”,从标准输入中读入,直到遇到delimiter分界符;
Shell将分界符delimiter之后直到下一个相同分界符之前的所有内容作为输入,遇到下一个分界符表示输入结束;
最常见的delimiter分界符是EOF,也可自定义为其他字符;
3 自动交互实现
#!/bin/bash
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脚本执行结束;
二、自动交互交互方法二——管道
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/expect
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,平台通用性不高,较麻烦;
以上是关于Shell脚本——与Linux Shell自动交互的主要内容,如果未能解决你的问题,请参考以下文章