设为首页 收藏本站
查看: 1622|回复: 0

[经验分享] Ubuntu下使用TFTP进行文件传输的实现

[复制链接]

尚未签到

发表于 2015-12-16 12:20:26 | 显示全部楼层 |阅读模式



本文系转载自http://wenku.baidu.com/view/a86e92ef8bd63186bcebbcd3.html。本人在Ubuntu10.04LTS上亲测试该方法有效、便捷。

使用TFTP进行文件传输  

(系统版本: Ubuntu 10.10或以上

  
  
在嵌入式系统开发中,经常需要从主机上传送映像、文件等到目标机上。实现的方法有很多。如tftp,scp
TFTP(Trivial File Transfer Protocol)是用来下载远程文件的最简单的网络协议,它基于UDP协议而实现。

  一、TFTP的建立
嵌入式linuxtftp开发环境包括两个方面:一是linux服务器端的tftp-server支持,二是嵌入式目标系统的tftp-client支持。因为u-boot本身内置支持tftp-client,所以嵌入式目标系统端就不用配置了。我们要做的是在服务器端(即主机)上安装TFTP服务,并且正确地配置TFTP服务的路径和参数。
下面我尝试了两种搭建TFTP的方法,都实测成功。


  1、安装tftp所需软件包:
tftp有好几种版本,其中tftptftpd是最经典、最常用的。还有增强版,如atftpatftpdtftp-hpatftpd-hpa等。所以配置TFTP的方法也不唯一。

  传统方法(xinetd
  sudo apt-get install tftp
  sudo apt-get install tftpd
  sudo apt-get install xinetd
  
tftp是客户端,作用是从别人的TFTP服务器端上传/下载东西。
tftpd是服务端,字母d代表daemon,作用是为别人提供TFTP服务,供别人上传/下载东西。
xinetdinetd的扩展。inetd 服务器是一个专门管理入网连接的网络后台程序,xinetd现在已经取代inetd它一个守护进程,用于处理对各种服务的请求。tftp是要用inetd来控制的。
  
  另一种更简单的方法:tftp-hpa
  sudo apt-get install tftp-hpa
  sudo apt-get install tftpd-hpa

tftp-hpatftp作用相当,但两者是冲突的,不能同时安装。tftpd-hpatftpd的关系同理。这种方法下,不需要inetd服务就可以。网上也有人同时装了xinetd,不仅需要配置,似乎还容易出问题。
  
  
  2、创建TFTP目录
首先需要建立一个TFTP目录,以供上传和下载。当然也可以使用现有的目录。然后需要设定该目录的权限,决定是否能够下载和上传文件。对于日常使用,我们一般就将其权限设置为最高,为所有用户组都添加所有权限(读++执行=4+2+1=7):
  sudo mkdir /home/tftpboot
  cd /home
  sudo chmod 777 tftpboot –R

我们的TFTP目录为/home/example/tftp,其权限已经是最高。
  
  3、修改配置文件
对于xinetd方法,要在/etc/xinetd.d/下,修改配置文件tftp。如果是第一次使用,没有这个文件,需要自己创建一个空文件。可以利用touch指令:
  cd /etc/xinetd.d
  touch tftp
  sudo gedit tftp

在打开的文件中输入以下内容:
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /home/tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}

  socket_type:网络套接字类型,流或者数据包
  protocol:IP 协议,通常是TCP或者 UDP
  user:运行进程的用户 ID当前用户或root
  server:执行的完整路径
  server_args: 传递给server的变量或值。前面的-s代表tftp参数,后面/home/tftpbootTFTP的根目录,可以根据自己实际情况来修改地址,如/home/example/tftp


对于tftp-hpa方法,不需要装inetd就能使用,只要修改tftpd-hpa相应的配置文件就可以。
  sudo gedit /etc/default/tftpd-hpa
  
  原始的内容如下:
  # /etc/default/tftpd-hpa
  TFTP_USERNAME="tftp"
  TFTP_DIRECTORY="/var/lib/tftpboot"
  TFTP_ADDRESS="0.0.0.0:69"
  TFTP_OPTIONS="--secure"
  
  我将其修改为:
  # /etc/default/tftpd-hpa
  TFTP_USERNAME="donghai"
  TFTP_DIRECTORY="/home/tftpboot"
  TFTP_ADDRESS="0.0.0.0:69"
  TFTP_OPTIONS="-l -c -s"
  
  说明:
  TFTP_USERNAME必须改为当前的用户名,或者root
  TFTP_DIRECTORY:我们设定的TFTP根目录;
  TFTP_OPTIONSTFTP启动参数。意义如下:
   ------------------------------转载后注--------------------------------------------------------
TFTP_USERNAME这一变量设置不一定要是当前用户名,保持为tftp也可以。
在系统管理->用户和组下可以看到 tftp在Ubuntu中是一个用户组名
-------------------------------------------------------------------------------------------------
  -l:以standalone/listen模式启动TFTP服务,而不是从inetd启动。
(这里也表明,再像前面一样装xinetd,其实是多此一举)
-c:可创建新文件。默认情况下,TFTP只允许覆盖原有文件,不能创建新文件。
  -s:改变TFTP启动的根目录。加了-s后,客户端使用TFTP时,不再需要输入指定目录,填写文件的完整路径,而是使用配置文件中写好的目录。这样也可以增加安全性。

我一开始没有注意TFTP_USERNAME这一项,随便取了一个名字,一直没有成功,后来改用自己的用户名,才测试成功。

  4、重新启动服务
如果用xinetd,修改好tftp的配置文件后,需要重新启动一下xinetd。每次修改完配置文件后,都需要重新启动该服务
  sudo /etc/init.d/xinetd restart
  
  
如果用tftp-hpa,要重启tftpd-hpa服务:
  sudo service tftpd-hpa restart
如果显示如下,说明配置正确:
  tftpd-hpa start/running, process 2290

之前我没有把TFTP_USERNAME该为用户名,而是随便取了一个,则会提示如下:
  tftpd-hpa start/running
对比发现,这里并没有启动进程,因为配置中TFTP_USERNAME不正确,也就没有成功开启TFTP
  

  5、确认tftp服务是否已经开启
  下面确认tftp服务是否开启(基于tftp-hpa方法)。
查看tftp相关进程可以用以下指令:
  ps aux |grep tftp
弹出以下信息
  root      2290  0.0  0.0   2364   120 ?        Ss   19:45   0:00 /usr/sbin/in.tftpd --listen --user donghai --address 0.0.0.0:69 -l -c -s /home/tftpboot
可以看到, /usr/sbin/in.tftpd已经启动,说明TFTP服务已经开启了,进程号正是2290
--listen对应配置文件中的参数 -l
--user donghai就是配置文件中的TFTP_USERNAME
/home/tftpboot是配置文件中的TFTP_DIRECTORY
  
  另一种方法:
  netstat -a|grep tftp
  如果看到如下提示,说明TFTP服务开启了。
  udp        0      0 *:tftp                  *:*


  
二、TFTP的使用
  1、连接本机
连接本机有三种方法,一是输入真实的IP地址,可以用ifconfig查得;二是用localhost来代表本机;三是使用地址127.0.0.1,这个IP地址始终代表本机的IP
先在TFTP目录下新建一个文件a,在里面随便写一些内容,然后修改其权限为777。接着,输入以下指令的任意一条,进入TFTP命令行。
  tftp 192.168.1.201  (自己设定的IP
  tftp localhost
  tftp 127.0.0.1
  
  TFTP命令行的基本指令:
put:将文件上传到TFTP目录
get:取得TFTP目录上的文件
quit/q:退出TFTP

因为TFTP服务将某一设定的目录视为根目录,因此不需要打出完整的路径。既然该目录下已经有一个文件a,我们就下面输入指令:
  tftp> get a
  Received 5 bytes in 0.0 seconds
  
  tftp> put a
  Sent 5 bytes in 0.0 seconds
  这样就传输成功了。在方法1中,传输成功后会有时间的提示;而在方法2中,如果没有任何提示,则说明传输成功。

下面看看当配置参数和文件权限改变时,会出现什么现象。我列举了一些常见问题:
  
  tftp> get a
  Transfer timed out.
  原因:tftpd服务没有启动。
需要注意的是,必须使TFTP的用户名和当前的系统的用户名一致,否则就无法成功启动tftpd服务
  
  tftp> get a
  permission denied
  原因:操作者权限不够,比如当前的目录是/etc,不能随便get文件下来。需要提升权限。切换到root账户,或者直接执行sudo tftp
  
  tftp> put t1
  tftp: t1: No such file or directory
  原因:当前目录下没有t1文件
  
  tftp> get d
  Error code 1: File not found原因:TFTP根目录下没有该文件
  
  Error code 2: Only absolute filenames allowed
  原因:TFTP启动配置参数没有-s,或者在DIRECTORY中没有填写目录
  
  以下针对xinetd方法:
  tftp> put a
  Error code 2: Access violation
  原因:1  TFTP启动配置中无-c,TFTP目录没有同名文件
2  TFTP启动配置中无-c,TFTP目录有同名文件,但无写权限
  解决:chmod 777 a
  
  以下针对tftp-hpa方法
  tftp> put b
  Error code 1: File not found
  原因:启动配置参数无-c,根目录下无同名文件
  (注意和前面情况的区别,不是当前目录下没有b文件,而是TFTP目录下找不到同名文件b
  
  tftp> put b
  Error code 2: File must have global write permissions
  原因:根目录下有同名文件,该文件无写权限(启动配置参数有无-c都这样)
  
经测试,在tftp-hpa方法下,下列情况可以put成功:
l 启动配置参数无-c,根目录下有同名文件,有写权限
l 启动配置参数有-c,根目录下无同名文件
l 启动配置参数有-c,根目录下有同名文件,有写权限
  
xinetd方法下,我将server_args = -s /home/tftpboot改为
  server_args = -s /home/tftpboot -c  server_args =-c -s /home/tftpboot
  试图增加-c参数,但重启xinetd后,却发现tftp基本的下载和上传都不行了。
因此在xinetd方法下,如需上传,应该让TFTP目录下有一个同名文件(开w权限),尚未找到直接上传文件的方法。
  
  2、连接实验箱
  实验箱操作系统中的TFTP服务已经装好,是在BusyBox v1.12.0中的。它的用法与本机的略有区别,但原理是一样的。
  
  基本参数:
  -g:   get,获取文件
  -p:   put,长传文件
  -l FILE:本地的文件,名为FILE
  -r FILE:远程的文件,名为FILE
  

  实验箱的IP地址为192.168.1.200,我主机的IP地址为192.168.1.201。两者的IP应该在一个网段内,才能顺利通信。
  
  使用举例:
  sudo minicom
进入了实验箱的Linux操作系统。

  # cd /home
  # tftp -g 192.168.1.201 -r./hello -l./hello
  将主机TFTP目录下的文件hello下载到实验箱的当前目录(/home)。
  # tftp -p 192.168.1.201 -r./led -l./led
  将实验箱的当前目录(/home)的文件led上传到主机TFTP目录下。
  
  二、TFTP的使用
  1、连接本机
连接本机有三种方法,一是输入真实的IP地址,可以用ifconfig查得;二是用localhost来代表本机;三是使用地址127.0.0.1,这个IP地址始终代表本机的IP
先在TFTP目录下新建一个文件a,在里面随便写一些内容,然后修改其权限为777。接着,输入以下指令的任意一条,进入TFTP命令行。
  tftp 192.168.1.201  (自己设定的IP
  tftp localhost
  tftp 127.0.0.1
  
  TFTP命令行的基本指令:
put:将文件上传到TFTP目录
get:取得TFTP目录上的文件
quit/q:退出TFTP

因为TFTP服务将某一设定的目录视为根目录,因此不需要打出完整的路径。既然该目录下已经有一个文件a,我们就下面输入指令:
  tftp> get a
  Received 5 bytes in 0.0 seconds
  
  tftp> put a
  Sent 5 bytes in 0.0 seconds
  这样就传输成功了。在方法1中,传输成功后会有时间的提示;而在方法2中,如果没有任何提示,则说明传输成功。

下面看看当配置参数和文件权限改变时,会出现什么现象。我列举了一些常见问题:
  
  tftp> get a
  Transfer timed out.
  原因:tftpd服务没有启动。
需要注意的是,必须使TFTP的用户名和当前的系统的用户名一致,否则就无法成功启动tftpd服务
  
  tftp> get a
  permission denied
  原因:操作者权限不够,比如当前的目录是/etc,不能随便get文件下来。需要提升权限。切换到root账户,或者直接执行sudo tftp
  
  tftp> put t1
  tftp: t1: No such file or directory
  原因:当前目录下没有t1文件
  
  tftp> get d
  Error code 1: File not found原因:TFTP根目录下没有该文件
  
  Error code 2: Only absolute filenames allowed
  原因:TFTP启动配置参数没有-s,或者在DIRECTORY中没有填写目录
  
  以下针对xinetd方法:
  tftp> put a
  Error code 2: Access violation
  原因:1  TFTP启动配置中无-c,TFTP目录没有同名文件
2  TFTP启动配置中无-c,TFTP目录有同名文件,但无写权限
  解决:chmod 777 a
  
  以下针对tftp-hpa方法
  tftp> put b
  Error code 1: File not found
  原因:启动配置参数无-c,根目录下无同名文件
  (注意和前面情况的区别,不是当前目录下没有b文件,而是TFTP目录下找不到同名文件b
  
  tftp> put b
  Error code 2: File must have global write permissions
  原因:根目录下有同名文件,该文件无写权限(启动配置参数有无-c都这样)
  
经测试,在tftp-hpa方法下,下列情况可以put成功:
l 启动配置参数无-c,根目录下有同名文件,有写权限
l 启动配置参数有-c,根目录下无同名文件
l 启动配置参数有-c,根目录下有同名文件,有写权限
  
xinetd方法下,我将server_args = -s /home/tftpboot改为
  server_args = -s /home/tftpboot -c  server_args =-c -s /home/tftpboot
  试图增加-c参数,但重启xinetd后,却发现tftp基本的下载和上传都不行了。
因此在xinetd方法下,如需上传,应该让TFTP目录下有一个同名文件(开w权限),尚未找到直接上传文件的方法。
  
  2、连接实验箱
  实验箱操作系统中的TFTP服务已经装好,是在BusyBox v1.12.0中的。它的用法与本机的略有区别,但原理是一样的。
  
  基本参数:
  -g:   get,获取文件
  -p:   put,长传文件
  -l FILE:本地的文件,名为FILE
  -r FILE:远程的文件,名为FILE
  

  实验箱的IP地址为192.168.1.200,我主机的IP地址为192.168.1.201。两者的IP应该在一个网段内,才能顺利通信。
  
  使用举例:
  sudo minicom
进入了实验箱的Linux操作系统。

  # cd /home
  # tftp -g 192.168.1.201 -r./hello -l./hello
  将主机TFTP目录下的文件hello下载到实验箱的当前目录(/home)。
  # tftp -p 192.168.1.201 -r./led -l./led
  将实验箱的当前目录(/home)的文件led上传到主机TFTP目录下。
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151992-1-1.html 上篇帖子: 嵌入式linux的tftp安装配置及tftp命令用法 下篇帖子: Linux 文件共享之ftp服务
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表