您的位置:首页 > 运维架构 > Shell

Shell脚本——与Linux Shell自动交互

2017-05-16 14:16 489 查看
自动交互的关键是交互信息的自动输入;

一、自动交互方法一——重定向

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,平台通用性不高,较麻烦;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: