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自动交互的主要内容,如果未能解决你的问题,请参考以下文章

linux shell expect 自动交互脚本

Shell脚本交互之:自动输入密码

linux通过shell脚本实现telnet交互式自动化

shell脚本常用命令:expect

shell脚本的基础1

shell编程规范与变量