Linux FTP下载数据文件

本文遵循BY-SA版权协议,转载请附上原文出处链接。


本文作者: 黑伴白

本文链接: http://heibanbai.com.cn/posts/bfe26356/

Linux FTP下载数据文件

说明

通过Linux的ftp客户端命令,实现获取远程服务器数据文件, 提供FTP脚本源码, 仅供参考!

通过包含如何判断FTP执行是否成功.

脚本源码

FTP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/bin/bash

##############################################################
# Date : 2024-07-28
# AUTHOR: zhaoty
# Desc : ftp获取远程服务器数据文件
##############################################################

# 获取脚本名称
shName=`basename $0`

# 接收参数
ftpIp=$1
ftpUser=$2
ftpPwd=$3
ftpPath=$4
localPath=$5

# 当前系统日期-yyyymmdd
sysDate=`date +"%Y%m%d"`

# 定义日志文件路径和日志文件名
logPath=/home/zhaoty/data/log/sftpgpfile/${sysDate}
logFile=${logPath}/ftpFile.log

# 定义日志函数
Log()
{
createTime=`date +"%Y-%m-%d %H:%M:%S"`
echo "[${createTime}] $*" |tee -a ${logFile} 2>/dev/null
}

# 定义检查创建目录函数
CheckDir()
{
if [ ! -d $1 ]; then
mkdir_log=` mkdir -p -m 775 $1 `
if [ $? -ne 0 ]; then
echo "[ERROR]: Directory [$1] create fail, please check..."
exit 1
fi
fi
}

# 检查日志目录
CheckDir "${logPath}"

# 检查参数个数
if [ $# -ne 5 ]; then
Log "[Error] 参数输入错误, 请检查!"
Log "[Error] Eg:"
Log "[Error] sh ${shName} FTP服务器IP FTP用户 FTP密码 FTP路径 本地路径"
exit 1
fi

# ftp参数
# -v: 显示所有响应信息
# -i: 关闭交互式提示
# -d: 启用调试模式
# -n: 抑制自动登录

# FTP获取指定文件函数
FtpFile()
{
logFile=$1
ftpIp=$2
ftpUser=$3
ftpPwd=$4
ftpPath=$5
localPath=$6
fileName=$7

ftp -i -n -v >${logFile} 2>&1 <<FTPFILE
open ${ftpIp}
user ${ftpUser} ${ftpPwd}
cd ${ftpPath}
lcd ${localPath}
get ${fileName}
bye
FTPFILE
}

# FTP获取远程路径下所有文件
FtpAllFile()
{
logFile=$1
ftpIp=$2
ftpUser=$3
ftpPwd=$4
ftpPath=$5
localPath=$6

ftp -i -n -v >${logFile} 2>&1 <<FTPFILE
open ${ftpIp}
user ${ftpUser} ${ftpPwd}
cd ${ftpPath}
lcd ${localPath}
mget *.txt
bye
FTPFILE
}
# 检查FTP获取文件是否成功
FtpCheck()
{
logFile=$1
fileName=$2
grep "Not Connected" ${logFile}
if [ $? -eq 0 ]; then
Log "登录FTP服务器[${ftpIp}]失败, 地址错误或网络不通, 请检查..."
Log "日志信息:\n`cat ${logFile}`"
exit 1
fi

grep "Login failed" ${logFile}
if [ $? -eq 0 ]; then
Log "登录FTP服务器[${ftpIp}]失败, 用户名或密码错误, 请检查..."
Log "日志信息:\n`cat ${logFile}`"
exit 1
fi

grep "Failed to change directory" ${logFile}
if [ $? -eq 0 ]; then
Log "切换FTP目录[${ftpPath}]失败, 请检查..."
Log "日志信息:\n`cat ${logFile}`"
exit 1
fi

grep "Failed to open file" ${logFile}
if [ $? -eq 0 ]; then
Log "存在文件[${localPath}/${fileName}]获取失败, 地址错误或网络不通, 请检查..."
Log "日志信息:\n`cat ${logFile}`"
exit 1
fi
}

Log "[Info] 开始执行脚本获取数据:"
Log "[Info] ftpIp : ${serverIp}"
Log "[Info] ftpUser : ${sftpUser}"
Log "[Info] ftpPass : ${sftpPass}"
Log "[Info] ftpPath : ${localPath}"
Log "[Info] localPath : ${remotePath}"
Log ""

if [ ! -w "${localPath}" ]; then
Log "本地目录[${localPath}]不存在或无写权限, 请检查..."
exit 1
fi

# ftp日志
ftpLog=${localPath}/ftp.log

# 获取文件
FtpFile ${ftpLog} ${ftpIp} ${ftpUser} ${ftpPwd} ${ftpPath} ${localPath} test.txt
FtpCheck ${ftpLog}

Log "文件[test.txt]获取成功!"

LFTP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#!/bin/bash

##############################################################
# Date : 2024-07-28
# AUTHOR: zhaoty
# Desc : ftp获取远程服务器数据文件
##############################################################

# 获取脚本名称
shName=`basename $0`

# 接收参数
ftpIp=$1
ftpUser=$2
ftpPwd=$3
ftpPath=$4
localPath=$5

# 当前系统日期-yyyymmdd
sysDate=`date +"%Y%m%d"`

# 定义日志文件路径和日志文件名
logPath=/home/zhaoty/data/log/sftpgpfile/${sysDate}
logFile=${logPath}/ftpFile.log

# 定义日志函数
Log()
{
createTime=`date +"%Y-%m-%d %H:%M:%S"`
echo "[${createTime}] $*" |tee -a ${logFile} 2>/dev/null
}

# 定义检查创建目录函数
CheckDir()
{
if [ ! -d $1 ]; then
mkdir_log=` mkdir -p -m 775 $1 `
if [ $? -ne 0 ]; then
echo "[ERROR]: Directory [$1] create fail, please check..."
exit 1
fi
fi
}

# 检查日志目录
CheckDir "${logPath}"

# 检查参数个数
if [ $# -ne 5 ]; then
Log "[Error] 参数输入错误, 请检查!"
Log "[Error] Eg:"
Log "[Error] sh ${shName} FTP服务器IP FTP用户 FTP密码 FTP路径 本地路径"
exit 1
fi

# ftp参数
# -v: 显示所有响应信息
# -i: 关闭交互式提示
# -d: 启用调试模式
# -n: 抑制自动登录

# FTP获取指定文件函数
FtpFile()
{
logFile=$1
ftpIp=$2
ftpUser=$3
ftpPwd=$4
ftpPath=$5
localPath=$6
fileName=$7

lftp -du ${ftpUser},${ftpPwd} ftp://${ftpIp} >${logFile} 2>&1 <<FTPFILE
set net:timeout 5
set net:max-retries 1
set net:reconnect-interval-multiplier 1
set net:reconnect-interval-base 5
set xfer:clobber on

cd ${ftpPath}
lcd ${localPath}
get ${fileName}
bye
FTPFILE
}

# FTP获取远程路径下所有文件
FtpAllFile()
{
logFile=$1
ftpIp=$2
ftpUser=$3
ftpPwd=$4
ftpPath=$5
localPath=$6

lftp -du ${ftpUser},${ftpPwd} ftp://${ftpIp} >${logFile} 2>&1 <<FTPFILE
set net:timeout 5
set net:max-retries 1
set net:reconnect-interval-multiplier 1
set net:reconnect-interval-base 5
set xfer:clobber on

cd ${ftpPath}
lcd ${localPath}
mget *.txt
bye
FTPFILE
}
# 检查FTP获取文件是否成功
FtpCheck()
{
logFile=$1
fileName=$2
# 是否有获取数据文件
fileFlag=$3

grep "Fatal error: max-retries exceeded" ${logFile}
if [ $? -eq 0 ]; then
Log "登录FTP服务器[${ftpIp}]失败, 地址错误或网络不通, 请检查..."
Log "日志信息:\n`cat ${logFile}`"
exit 1
fi

grep "Login failed" ${logFile}
if [ $? -eq 0 ]; then
Log "登录FTP服务器[${ftpIp}]失败, 用户名或密码错误, 请检查..."
Log "日志信息:\n`cat ${logFile}`"
exit 1
fi

grep "Failed to change directory" ${logFile}
if [ $? -eq 0 ]; then
Log "切换FTP目录[${ftpPath}]失败, 请检查..."
Log "日志信息:\n`cat ${logFile}`"
exit 1
fi

grep "Failed to open file" ${logFile}
if [ $? -eq 0 ]; then
Log "存在文件[${localPath}/${fileName}]获取失败, 地址错误或网络不通, 请检查..."
Log "日志信息:\n`cat ${logFile}`"
exit 1
fi

if [ "X${fileFlag}" == "XY" ]; then
# no files found 暂不检查
getFlag=`grep "Transfer complete" ${logFile}`
if [ $? -ne 0 ]; then
Log "未获取任何文件, 请检查:\n`cat ${logFile}`"
exit 1
else
Log "获取文件信息如下:\n`grep -B4 "Transfer complete" ${ftpLog}|awk '/Transfer complete/ {num++} {if ($0 ~ "Transfer complete") {print ""num"个文件:"$0;} else {print $0;}}'`"
fi
fi
}

Log "[Info] 开始执行脚本获取数据:"
Log "[Info] ftpIp : ${serverIp}"
Log "[Info] ftpUser : ${sftpUser}"
Log "[Info] ftpPass : ${sftpPass}"
Log "[Info] ftpPath : ${localPath}"
Log "[Info] localPath : ${remotePath}"
Log ""

if [ ! -w "${localPath}" ]; then
Log "本地目录[${localPath}]不存在或无写权限, 请检查..."
exit 1
fi

# ftp日志
ftpLog=${localPath}/ftp.log

# 获取文件
FtpFile ${ftpLog} ${ftpIp} ${ftpUser} ${ftpPwd} ${ftpPath} ${localPath} test.txt
FtpCheck ${ftpLog}

Log "文件[test.txt]获取成功!"

蚂蚁🐜再小也是肉🥩!


Linux FTP下载数据文件
http://heibanbai.com.cn/posts/bfe26356/
作者
黑伴白
发布于
2024年9月6日
许可协议

“您的支持,我的动力!觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付