shell脚本之从服务器批量下载文件

前言

使用bash与expect写一个从服务器批量下载文件的脚本。记录shell bash expect之间的关系与用法。

什么是shell

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。

shell 和 shell script 是两个不同的概念

bash与expect都可以称之为shell,shell相当于是类,bash与expect可以理解成是shell的实例。

bash

介绍

通常bash是默认shell,在编程方面相当优秀,但在处理与用户的交互方面作得不如其他几种 shell。(如下面介绍的expect)

代码示例

定义一个变量和使用一个循环作为展示。

test.sh文件

1
2
3
4
5
6
7
#!/bin/bash
host='127.0.0.1'

echo $host
for i in "$@"; do
echo $i
done

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行。

$@ 输入参数的集合 例如控制台输入 ./test.sh AAA BBB ,$@ 就相当于 [“AAA”,”BBB”]集合

运行

运行前需要取得文件的权限

1
chmod u+x ./test.sh

接着执行

1
./test.sh AAA BBB

AAA BBB 是参数可以任意个数

控制台输出

1
2
3
127.0.0.1
AAA
BBB

127.0.0.1是定义的host变量

AAA和BBB 是入参

expect

介绍

expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

例如在执行ssh连接的时候,会提示输入 password 这个时候使用bash就无法做到自动交互了。

1
2
ssh -p 22 root@127.0.0.1
root@127.0.0.1's password:🔑

代码示例

同样定义一个变量和使用一个循环作为展示。

my_expect

1
2
3
4
5
6
7
#!/usr/bin/expect
set host 127.0.0.1

puts $host
for {set i 0} {$i < $argc} {incr i} {
puts [lindex $argv $i]
}

运行

运行前需要取得文件的权限

1
chmod u+x ./my_expect

接着执行

1
expect ./my_expect.sh AAA BBB

不同点多了个 expect 前缀命令

输出内容与上面完全相同,这里就不做展示了。

批量下载文件

这里展示使用bash与expect,当然也可以只使用expect。

scp_demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
host='127.0.0.1'
port='22'
user='root'
password='你的密码'
toPath='下载后的本地保存路径'

# 需要下载的目标文件地址 空格分割
downloadFiles=(/home/user/data/xxx.txt /home/user/data/yyy.txt)
length=${#downloadFiles[*]}
for ((i = 0; i < $length; i++)); do
expect -c "
spawn scp -P $port $user@$host:${downloadFiles[$i]} $toPath;
expect "*password*";
send \"$password\r\";
interact;"
done

expect -c 执行except脚本。

spawn 获取匹配信息,如果匹配成功则执行expect后面的程序动作。

scp secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。

send 用于发送指定的字符串信息

interact 留在控制台中手动执行后续命令操作

执行

1
2
3
cd 文件所在路径
chmod u+x ./scp_demo
./scp_demo

等待文件下载完成即可,当然也也可把下载文件改成参数传入形式的,参考上面的代码即可,这里就不做演示了。