【转】Linux环境搭建FTP服务器与Python实现FTP客户端的交互介绍
Linux环境搭建FTP服务器与Python实现FTP客户端的交互介绍
FTP 是File Transfer Protocol(文件传输协议)的英文简称,它基于传输层协议TCP建立,用于Internet上文件的双向传输(上传和下载)。与大多数Internet服务一样,FTP也是一个客户端/服务器系统,要想完成文件传输需要FTP服务端和FTP客户端的配合。
FTP协议使用了两条TCP连接,一条是命令链路,用于在FTP客户端与服务器之间传递命令;另一条是数据链路,用来上传或下载数据。FTP服务器/客户端架构如图所示:
FTP协议有两种工作方式:PORT主动方式和PASV被动方式。无论哪种工作方式,首先都需要客户端主动与远程主机上的FTP 服务器建立命令链路。
PORT方式的连接过程:客户端从一个任意的非特权端口M(M>1023,0到1023用于绑定特定的服务)向FTP服务器的命令端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链上发送FTP命令“port M+1”到FTP服务器。接着客户端开始监听端口M+1,服务器会从它自己的数据端口(默认是20)连接到客户端指定的数据端口(M+1),建立一条数据链路来传送数据。
在PASV方式中,命令连接和数据连接都由客户端发起,当开启一个 FTP连接时,客户端打开两个任意的非特权本地端口( M > 1023和M +1)。第一个端口连接服务器的21端口建立一条命令链路,与PORT方式相同,但第二个端口建立数据链路的方式与PORT方式有所不同。当需要传送数据时,客户端提交PASV命令至服务器,这样做的结果是服务器会开启一个任意的非特权端口(N > 1023),并发送 PASV N命令给客户端。于是客户端发起从本地端口M+1到服务器的端口N的连接,建立一条数据链路用来传送数据。
由于使用FTP传送文件时必须先登录,在远程主机上获得相应的权限以后,才可上传和下载文件。除非有用户ID和口令,否则便无法传送文件。Internet上的FTP主机成千上万,不可能要求每个用户在每一台主机上都拥有帐号,这违背了Internet的开放性。于是产生了匿名FTP来解决这个问题。
通过匿名FTP机制,用户无需注册帐号就可以连接到远程主机上进行文件的上传和下载。系统管理员建立了一个特殊的用户ID,名为anonymous, Internet上的任何人在任何地方都可使用该用户ID。
Linux平台搭建FTP服务器一般在各种Linux的发行版中,默认带有的FTP软件是vsftp。Vsftpd(Very Secure FTP Daemon)是一款运行在类Unix操作系统的FTP服务端程序。此处在Linux平台ubuntu发行版上使用vsftp搭建一个FTP服务器,可配合Python实现的客户端进行测试。
(1)使用#rpm -qa |grep vsftpd命令检查是否安装vsftpd软件,未安装则使用#sudo apt-get install vsftpd命令安装vsftpd软件
(2)使用#netstat -tnl命令检查端口服务是否打开,FTP服务器默认打开的是21端口。
(3)使用#service vsftpd start |stop|restart命令启动、停止、重启FTP。
(4)FTP的配置文件位于/etc/vsftpd/目录下,包括用户禁止登陆列表ftpusers和user_list、主配置文件vsftpd.conf。
使用#sudo gedit /etc/vsftpd.conf命令修改配置文件vsftpd.conf,去除配置项前的#号以开启该项配置,修改配置文件后需要重启服务。
与匿名登陆相关的配置如下:
anonymous_enable=YES # 控制是否允许匿名用户登入,YES 为允许匿名登入,NO 为不允许。默认值为YES。
write_enable=YES # 是否允许登陆用户有写权限。属于全局设置,默认值为YES。
no_anon_password=YES #若启动这项功能,使用匿名登入时,不会询问密码。默认值为NO。
ftp_username=ftp#定义匿名登入的使用者名称。默认值为ftp。
anon_root=/var/ftp#使用匿名登入时,所登入的目录。默认值为/var/ftp。注意ftp目录不能是777的权限属性。
anon_upload_enable=YES#如果设为YES,则允许匿名登入者有上传文件(非目录)的权限,只有在write_enable=YES时,此项才有效。前提是匿名用户必须要有对上层目录的写入权。默认值为NO。anon_world_readable_only=YES#如果设为YES,则允许匿名登入者下载可阅读的档案(可以下载到本机阅读,不能直接在FTP服务器中打开阅读)。默认值为YES。
anon_mkdir_write_enable=YES#如果设为YES,则允许匿名登入者有新增目录的权限,只有在write_enable=YES时,此项才有效。前提是匿名用户必须要有对上层目录的写入权。默认值为NO。anon_other_write_enable=YES#如果设为YES,则允许匿名登入者更多于上传或者建立目录之外的权限,譬如删除或者重命名。(如果anon_upload_enable=NO,则匿名用户不能上传文件,但可以删除或者重命名已经存在的文件;如果anon_mkdir_write_enable=NO,则匿名用户不能上传或者新建文件夹,但可以删除或者重命名已经存在的文件夹。)默认值为NO。chown_uploads=YES #设置是否改变匿名用户上传文件(非目录)的属主。默认值为NO。
chown_username=username #设置匿名用户上传文件(非目录)的属主名。建议不要设置为root。
anon_umask=022#设置匿名登入者新增或上传档案时的掩码值。默认值为077。如umask是022,这时创建一个权限为666的文件,文件的实际权限为666-022=644。deny_email_enable=YES#若是启动这项功能,则必须提供一个档案/etc/vsftpd/banner_emails,内容为email address。若是使用匿名登入,则会要求输入email address,若输入的email address在此档案内,则不允许进入。默认值为NO。
banned_email_file=/etc/vsftpd/banner_emails #此文件用来输入emailaddress,只有在deny_email_enable=YES时,才会使用到此档案。若是使用匿名登入,则会要求输入emailaddress,若输入的email address 在此档案内,则不允许进入。其他主要配置如下所示:listen= NO # 服务器监听,是否以独立运行的方式监听服务local_enable=YES # 是否允许本地用户访问local_umask=022
### FTP上本地的文件权限,默认是077
#dirmessage_enable=YES # 进入文件夹允许xferlog_enable=YES
# ftp 日志记录允许onnect_from_port_20=YES
# 启用20号端口作为数据传送的端口xferlog_enable=yes
# 激活上传和下传的日志#xferlog_std_format=yes
# 使用标准的日志格式#ftpd_banner=XXXXX
# 欢迎信息local_root=/var/www #使用本地登入时,所登入的目录。pasv_enable=YES #若设置为YES,则使用PASV工作模式;若设置为NO,则使用PORT模式。默认值为YES,即使用PASV工作模式。pasv_min_port=30000 # 在PASV工作模式下,数据连接可以使用的端口范围的最大端口,0 表示任意端口。默认值为0。pasv_max_port=30999 # 在PASV工作模式下,数据连接可以使用的端口范围的最小端口,0 表示任意端口。默认值为0。
(5)使用#sudo userdel uftp命令删除用户,使用#sudo apt-get remove --purge vsftpd命令彻底删除该软件和相关文件
(6)匿名登陆目录的权限设置。默认情况下,匿名登入的根目录为/var/ftp(实际配置为/home/ftp),为了安全,这个目录默认不允许设置为777权限,否则ftp将无法匿名访问。当我们要匿名上传文件时,需要设置other用户的写权限。sudo chmod o+w /home/ftp更改ftp目录属主权限由默认的root权限为匿名的ftp权限,参数-R表示启动递归处理,修改某个目录下所有文件的权限,包括修改子目录中的文件权限。修改后ftp账户可以访问ftp文件夹。sudo chown ftp /home/ftp -Rsudo ls -l /home/总用量 12drwxr-xr-x 2 ftp root 4096 2月 15 19:09 ftpdrwxr-xr-x 2 uftp root 4096 2月 15 16:23 uftpdrwxr-xr-x 40 yuanxiao yuanxiao 4096 2月 15 19:22 yuanxiao
也可以在嵌入式Linux平台LED发行版上使用vsftp搭建一个FTP服务器。
(1)将开发板连接至外网,通过opkg命令安装vsftp。root@Yuanxiao:/etc/init.d# opkg update root@Yuanxiao:/etc/init.d# opkg install vsftpd
(2)配置/etc/vsftpd.conf文件,配置选项含义和方式与上述ubuntu发行版上的vsftpd相同。如果通过匿名登陆需要设置/etc/vsftpd.conf文件对应选项。
(3)更改/etc/vsftpd.conf文件的权限。在启动vsftpd 进程时会提示错误,表明配置文件不属于正确的用户。root@Yuanxiao:~# /etc/init.d/vsftpd start500 OOPS: config file not owned by correct user, or not a file解决方法为设置/etc/vsftpd.conf文件的访问用户(当前为root用户)root@Yuanxiao:~# chown root /etc/vsftpd.confroot@Yuanxiao:~# ls -l /etc/vsftpd.conf-rwxrwxrwx 1 root root 840 Feb 15 13:48 /etc/vsftpd.conf
(4)启动和停止vsftpd。/etc/init.d/vsftpd start/etc/init.d/vsftpd stop基于Python的客户端sFTP 程序示例
#!/usr/bin/python
# coding=utf-8
import paramiko
import os
import time
def sftp_upload(host,port,username,password,local,remote):
st = 0.25
sf = paramiko.Transport((host,port))
sf.connect(username = username,password = password)
sftp = paramiko.SFTPClient.from_transport(sf)
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host,port,username,password) # 用于输入命令,在服务器上创建文件夹
stdin, stdout, stderr = ssh.exec_command('find ' + remote)
result = stdout.read().decode('utf-8')
if len(result) != 0:
print('服务器文件夹已存在')
else:
stderr=ssh.exec_command('mkdir {}'.format(remote))
print('服务器文件夹不存在,正在创建:', remote)
time.sleep(2)## 停留2秒,服务器创建文件夹需要时间
#print(remote)
upload_num = 0
pic_num = 0
try:
if os.path.isdir(local):#判断本地参数是目录还是文件
for root,dirname,filenames in os.walk(local):
for file in filenames:#遍历本地目录
if file.endswith(".jpg") or file.endswith(".png"):
pic_num = pic_num + 1
src_file = os.path.join(root,file)
#print(os.path.join(local,f))
#f = local + "/" + f
#print(src_file)
#dest = os.path.join(remote,f)
# sftp.put(f, os.path.join(remote+f))#上传目录中的文件
sftp.put(src_file, remote+'/'+file)#上传目录中的文件
upload_num = upload_num +1
time.sleep(st)
else:
sftp.put(local,remote)#上传文件
except Exception as e:
print('upload exception:',e)
print('上传完毕,已经成功上传{}张图片'.format(upload_num))
print('{}目录中有{}张图片'.format(local, pic_num))
if(pic_num > upload_num):
print("出现丢图,丢图张数:{}".format(pic_num - upload_num))
ssh.close()
sftp.close()
sf.close()
def sftp_download(host,port,username,password,local,remote):
sf = paramiko.Transport((host,port))
sf.connect(username = username,password = password)
sftp = paramiko.SFTPClient.from_transport(sf)
try:
if os.path.isdir(local):#判断本地参数是目录还是文件
for f in sftp.listdir(remote):#遍历远程目录
sftp.get(os.path.join(remote+f),os.path.join(local+f))#下载目录中文件
else:
sftp.get(remote,local)#下载文件
except Exception as e:
print('download exception:',e)
sf.close()
if __name__ == '__main__':
host = '10.xxx.xx.xx'#主机
port = 22 #端口
username = '' #用户名
password = '' #密码
# local = '/sftptest/'#本地文件或目录,与远程一致,若当前为windows目录格式,window目录中间需要使用双斜线
localPath = r'C:\Users\micha\Desktop\50000-jiahuan\50000' #本地文件或目录,与远程一致,若当前为windows目录格式,window目录中间需要使用双斜线
remote_sshPath = '/ftp'#远程文件或目录,与本地一致,当前为linux目录格式
sftp_upload(host,port,username,password,localPath,remote_sshPath)#上传
#sftp_download(host,port,username,password,local,remote)#下载
【转】Linux环境搭建FTP服务器与Python实现FTP客户端的交互介绍的更多相关文章
- Windows/Linux 环境搭建Git服务器 + vs2012集成git
1. 下载.安装Git 我的系统是Windows 7,需要安装Git for Windows. 下载地址: http://code.google.com/p/msysgit/downloads/lis ...
- Linux 环境 搭建Git 服务器,并且修改SSH端口使用
1.环境配置说明 服务器 CentOS 7 + git(git version 1.8.3.1) 客户端 Windows10 + SourceTree 2.安装 Git 服务器端安装: sudo yu ...
- Linux环境搭建-在虚拟机中安装Centos7.0
最近在空闲时间学习Linux环境中各种服务的安装与配置,都属于入门级别的,这里把所有的学习过程记录下来,和大家一起分享. 我的电脑系统是win7,所以我需要在win7上安装一个虚拟机-VMware,然 ...
- CentOS Linux上搭建PPPoE服务器及拨号设置
CentOS Linux上搭建PPPoE服务器及拨号设置 搭建PPPoE,成功了的话,就觉得超级简单,在CentOS Linux更是5步左右就能搞定. 1.安装pppoe,安装完成后,会有pppoe- ...
- 【转】在Linux下搭建Git服务器
在 Linux 下搭建 Git 服务器 环境: 服务器 CentOS6.6 + git(version 1.7.1)客户端 Windows10 + git(version 2.8.4.windows. ...
- Linux系统搭建Red5服务器
Linux系统搭建Red5服务器 Red5 是 支持Windows,Linux等多平台的RTMP流媒体服务器,Windows下搭建相对容易,图形界面操作比较简单,Linux服务器的环境下没有图形界面, ...
- Linux环境搭建及基础操作
一.Linux环境搭建 1.安装虚拟机软件(VMWare,Parallel) 虚拟机的作用:将本来不是适合当前操作系统的分区虚拟化成适合当前操作系统的分区格式 2.新建虚拟机: 类似买了一台新的电脑, ...
- centos 8 集群Linux环境搭建
一.集群Linux环境搭建 1. 注意事项 1.1 windows系统确认所有的关于VmWare的服务都已经启动 打开任务管理器->服务,查看五个VM选项是否打开. 1.2 确认好VmWare生 ...
- 【菜鸟学习Linux】-第三章- Linux环境搭建-使用VMware9安装Ubuntu 12.04系统
上一步,我们安装了VMware9虚拟机,现在我们就是用它来安装Ubuntu12.04系统,至于Ubuntu是什么,我就不废话了,大家google一下,比我讲的清楚,好了,开始干活! Ubuntu官网下 ...
随机推荐
- 如何使用Istio 1.6管理多集群中的微服务?
假如你正在一家典型的企业里工作,需要与多个团队一起工作,并为客户提供一个独立的软件,组成一个应用程序.你的团队遵循微服务架构,并拥有由多个Kubernetes集群组成的广泛基础设施. 由于微服务分布在 ...
- PHP strtoupper() 函数
实例 把所有字符转换为大写: <?php高佣联盟 www.cgewang.comecho strtoupper("Hello WORLD!");?> 定义和用法 str ...
- C/C++编程笔记:C++入门知识丨从结构到类的演变
先来看看本节知识的结构图吧! 接下来我们就逐步来看一下所有的知识点: 结构的演化 C++中的类是从结构演变而来的, 所以我们可以称C++为”带类的C”. 结构发生质的演变 C++结构中可以定义函数, ...
- luogu P4008 [NOI2003]文本编辑器 splay 块状链表
LINK:文本编辑器 这个东西感觉块状链表写细节挺多 (块状链表本来就难写 解释一下块状链表的做法:其实是一个个数组块 然后利用链表给链接起来 每个块的大小为sqrt(n). 这样插入删除的时候直接暴 ...
- Java不会被淘汰的12个原因
如今,面对曾经在程序员中被各种新技术掩盖直至堙灭的技术值得怀念.犹如COBOL这当年被老程序员们尊为神器的语言如今也基本没有价值.而Java作为现代程序员的中坚力量在这点上或许会成为下一个COBOL. ...
- Junit4 测试代码
Junit4 测试代码 import org.junit.Test; import org.junit.runner.RunWith; @RunWith(SpringJUnit4ClassRunner ...
- 一个简单的CPP处理框架
好久没有在csdn上写过东西了,这么多年,一方面是工作忙,下班到家也没有开过电脑了,要陪小孩玩: 下面分享一段代码,是用CPP做的一个简单的消息(协议)处理框架: 是通过成员函数指针+map来实现的: ...
- JS 筋斗云案例
.nav { width: 1000px; height: 60px; line-height: 60px; margin: 0 auto; position: relative; } ul { wi ...
- Web 开发必须掌握的三个技术:Token、Cookie、Session
在Web应用中,HTTP请求是无状态的.即:用户第一次发起请求,与服务器建立连接并登录成功后,为了避免每次打开一个页面都需要登录一下,就出现了cookie,Session. Cookie Cookie ...
- Codechef July Challenge 2020 Division 1 记录
目录 Missing a Point Chefina and Swaps Doctor Chef Chef and Dragon Dens LCM Constraints Weird Product ...