使用TFTP進行文件傳輸

使用TFTP進行文件傳輸linux

(系統版本: Ubuntu 14.04或以上)ubuntu

 

 

在嵌入式系統開發中,常常須要從主機上傳送映像、文件等到目標機上。實現的方法有不少。如tftp,scp等。安全

TFTP(Trivial File Transfer Protocol)是用來下載遠程文件的最簡單的網絡協議,它基於UDP協議而實現。服務器

 

1、TFTP的創建網絡

嵌入式linux的tftp開發環境包括兩個方面:一是linux服務器端的tftp-server支持,二是嵌入式目標系統的tftp-client支持。由於u-boot自己內置支持tftp-client,因此嵌入式目標系統端就不用配置了。咱們要作的是在服務器端(即主機)上安裝TFTP服務,而且正確地配置TFTP服務的路徑和參數。dom

 

下面我嘗試了搭建TFTP的方法,實測成功。測試

 

 

首先須要安裝:tftp-hpaui

sudoapt-get install tftp-hpa操作系統

sudoapt-get install tftpd-hpa.net

 

tftp-hpa是客戶端,做用是從別人的TFTP服務器端上傳/下載東西。

tftpd-hpa是服務端,字母d表明daemon,做用是爲別人提供TFTP服務,供別人上傳/下載東西。

 

 

二、建立TFTP目錄

首先須要創建一個TFTP目錄,以供上傳和下載。固然也可使用現有的目錄。而後須要設定該目錄的權限,決定是否可以下載和上傳文件。對於平常使用,咱們通常就將其權限設置爲最高,爲全部用戶組都添加全部權限(讀+寫+執行=4+2+1=7):

sudomkdir ~/tftp_boot

sudochmod 777 tftp_boot –R

 

咱們的TFTP目錄爲/home/ghostar/tftp_boot,其權限已是最高。

 

三、修改配置文件

修改tftpd-hpa相應的配置文件

sudogedit /etc/default/tftpd-hpa

 

原始的內容以下:

#/etc/default/tftpd-hpa

TFTP_USERNAME="tftp"

TFTP_DIRECTORY="/var/lib/tftpboot"

TFTP_ADDRESS="[...]:69"

TFTP_OPTIONS="--secure"

 

我將其修改成:

#/etc/default/tftpd-hpa

TFTP_USERNAME="ghostar"

TFTP_DIRECTORY="/home/ghostar/tftp_boot"

TFTP_ADDRESS="0.0.0.0:69"

TFTP_OPTIONS="-l-c -s"

 

說明:

TFTP_USERNAME:必須改成當前的用戶名,或者root

TFTP_DIRECTORY:咱們設定的TFTP根目錄;

TFTP_OPTIONS:TFTP啓動參數。意義以下:

 

-l:以standalone/listen模式啓動TFTP服務,而不是從inetd啓動。

(這裏也代表,再像前面同樣裝xinetd,實際上是畫蛇添足)

-c:可建立新文件。默認狀況下,TFTP只容許覆蓋原有文件,不能建立新文件。

-s:改變TFTP啓動的根目錄。加了-s後,客戶端使用TFTP時,再也不須要輸入指定目錄,填寫文件的完整路徑,而是使用配置文件中寫好的目錄。這樣也能夠增長安全性。

 

我一開始沒有注意TFTP_USERNAME這一項,隨便取了一個名字,一直沒有成功,後來改用本身的用戶名,才測試成功。

 

四、從新啓動服務

 

重啓tftpd-hpa服務:

sudo service tftpd-hpa restart

若是顯示以下,說明配置正確:

tftpd-hpastart/running, process 2290

 

以前我沒有把TFTP_USERNAME該爲用戶名,而是隨便取了一個,則會提示以下:

tftpd-hpastart/running

對比發現,這裏並無啓動進程,由於配置中TFTP_USERNAME不正確,也就沒有成功開啓TFTP。

 

 

五、確認tftp服務是否已經開啓

         下面確認tftp服務是否開啓。

查看tftp相關進程能夠用如下指令:

psaux |grep tftp

彈出如下信息

ghostar@ubuntu:~$ ps aux|grep tftp
root       3151  0.0  0.0  15128   152 ?        Ss   23:19   0:00 /usr/sbin/in.tftpd --listen --user ghostar --address 0.0.0.0:69 -l -c -s /home/ghostar/tftp_boot
ghostar    3156  0.0  0.0  15956   956 pts/12   S+   23:20   0:00 grep --color=auto tftp

 

能夠看到, /usr/sbin/in.tftpd已經啓動,說明TFTP服務已經開啓了,進程號正是3151。

--listen對應配置文件中的參數 -l

--user ghostar          就是配置文件中的TFTP_USERNAME

/home/ghostar/tftp_boot是配置文件中的TFTP_DIRECTORY

 

         另外一種方法:

netstat-a|grep tftp

         若是看到以下提示,說明TFTP服務開啓了。

udp        0     0 *:tftp                  *:*

 

 

2、TFTP的使用

一、鏈接本機

鏈接本機有三種方法,一是輸入真實的IP地址,能夠用ifconfig查得;二是用localhost來表明本機;三是使用地址127.0.0.1,這個IP地址始終表明本機的IP。

先在TFTP目錄下新建一個文件a,在裏面隨便寫一些內容,而後修改其權限爲777。接着,輸入如下指令的任意一條,進入TFTP命令行。

tftp 192.168.1.201  (本身設定的IP)

tftp localhost

tftp127.0.0.1

 

TFTP命令行的基本指令:

put:將文件上傳到TFTP目錄

get:取得TFTP目錄上的文件

quit/q:退出TFTP

 

由於TFTP服務將某一設定的目錄視爲根目錄,所以不須要打出完整的路徑。既然該目錄下已經有一個文件a,咱們就下面輸入指令:

tftp>get a

 

tftp>put a

 

若是沒有任何提示,則說明傳輸成功。

 

下面看看當配置參數和文件權限改變時,會出現什麼現象。我列舉了一些常見問題:

 

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 filenamesallowed

緣由:TFTP啓動配置參數沒有-s,或者在DIRECTORY中沒有填寫目錄

 

tftp>put b

Error code 1: File not found

緣由:啓動配置參數無-c,根目錄下無同名文件

(注意和前面狀況的區別,不是當前目錄下沒有b文件,而是TFTP目錄下找不到同名文件b)

 

tftp>put b

Error code 2: File must have global writepermissions

緣由:根目錄下有同名文件,該文件無寫權限(啓動配置參數有無-c都這樣)

 

經測試,在tftp-hpa方法下,下列狀況能夠put成功:

l  啓動配置參數無-c,根目錄下有同名文件,有寫權限

l  啓動配置參數有-c,根目錄下無同名文件

l  啓動配置參數有-c,根目錄下有同名文件,有寫權限

 

二、鏈接實驗箱(未完成)

         實驗箱操做系統中的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目錄下。

相關文章
相關標籤/搜索