Linux搭建ftp服务器传输文件

295 阅读3分钟

“Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。”

这篇主讲Linux搭建FTP服务器的过程,同时请大家思考它比scp原生命令有什么好处呢?

ftp服务器的搭建

  • 查询是否已安装ftp:rpm -qa|grep vsftpd
  • 卸载已安装的ftp:rpm -e vsftpd-3*
  • 安装服务器:yum install -y vsftpd
  • 创建登录ftp用户:useradd ftptest,不想它登录linux参数:-s /sbin/nologin
    • 修改已存在用户不能登录系统:usermod -s /sbin/nologin ftptest
    • 修改nologin用户的shell权限:usermod -s /bin/bash ftptest
  • 关键配置文件/etc/vsftpd/vsftpd.conf,权限设置参数介绍:
anonymous_enable=[YES|NO]  # 默认yes默认匿名用户访问,安全设置NO
local_enable=YES  # 允许本地用户访问
write_enable=YES  # 允许写入
xferlog_file=/var/log/xferlog # 日志目录
chroot_list_enable=YES # 设置yes,限制访问自身根目录
chroot_list_file=/etc/vsftpd/chroot_list
userlist_enable=YES # user_list白名单生效
userlist_deny=NO # user_list白名单可访问
local_root=/var/ftp # 访问ftp的根目录
  • 黑名单不能访问ftp用户:ftpusers
  • 白名单能访问ftp的用户:user_list,只在userlist_deny=NO有效
  • 解决nologin用户登录ftp服务器问题:
编辑:/etc/shells
增加:/sbin/nologin
  • ftp自动登录上传文件到服务器脚本
#!/bin/bash
#此脚本用于每天定时将生成的数据文件上传到客户FTP服务
#指定上传文件所在的主目录
SRCDIR=/opt/
#指定所需上传对端FTP服务器的目录
DESDIR=pub/
#指定对端FTP服务器的用户名和密码
USER=ftptest
PASSWD="xiaomi2A"
#指定目标FTP服务器的IP
IP=47.112.100.85
#指定目标FTP服务器端口,一般都是默认
PORT=21
#指定所要上传文件的日期
targetDay=`date -d "-1 days" +"%Y%m%d"`
#获取所要上传的文件
#cd $SRCDIR
#for host in 192.168.2.18
#do
#    scp root@$host:$SRCDIR/test.txt ./
#done
#判定文件是否获取正确
[ $? -eq 0 ] || echo "Copy romote files failed, pls check." >>$SRCDIR/upload_file.log

#上传文件到FTP服务器
ftp -ivn <<EOF
    open $IP $PORT
    user $USER $PASSWD
    passive
    binary
    pwd
    lcd $SRCDIR
    put test.txt
    quit
EOF
#判定文件是否上传成功
[ $? -eq 0 ] && echo "Upload $targetDay's files to romote FTP server successful." >>$SRCDIR/upload_file.log || echo "Upload files failed, pls check." >>$SRCDIR/upload_file.log

expect脚本语言

expect是一个用来实现自动交互功能的工具,使用expect-send来实现交互过程。脚本的执行方法与bash shell不一样,如:expect example.exp
  • 安装:yum install -y expect
  • 向脚本传参:
向一个expect脚本传递参数,bash shell是使用$1,$2...来接收参数的,而epxect则将脚本的执行参数保存在数组$argv中,在脚本中一般将其赋值给变量:set 变量名 [lindex $argv 参数<也是从0脚本开始>]
  • expect脚本示例:set设置变量、send发送指令、eof提出expect脚本;
#!/usr/bin/expect
set DATE [exec date +%Y%m%d%k]
set password ssss
#set filename [lindex $argv 0]
set serverip "47.21.115.120"
spawn scp  root@$serverip:/opt/test.txt /opt
set timeout 300
expect "root@$serverip's password:"
set timeout 300
send "$password\r"
set timeout 300
send "exit\r"
expect eof
  • 这样可以实现自动交互,scp远程传递文件不用输入密码,ssh也可以用来做跳板机免密连接远程服务器
  • 示例ssh连接远程服务器:interact继续操作<等待人工交互>,eof是退出自动化
#!/usr/bin/expect
set ip [lindex $argv 0]
set username [lindex $argv 1]
set passwd [lindex $argv 2]
spawn ssh -l $username $ip
expect {
        "yes/no" { send "yes\r";exp_continue }
        "password:" { send "$passwd\r" }
}
#expect eof
interact
  • argv0是脚本本身,[lindexargv0是脚本本身,[lindex argv 0]则是第一个参数,依此类推
yum安装,找不到镜像安装,尝试其他镜像
解决步骤:
yum clean all  # 清理缓存
yum makecache  # 创建缓存
yum -y update  # 升级yum
最后再重新安装所需要的包
tips:会导致无法访问外网,可能需要设置网卡dns或重启网卡