《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于vsftp的嵌入式設(shè)備受控訪(fǎng)問(wèn)方法
基于vsftp的嵌入式設(shè)備受控訪(fǎng)問(wèn)方法
來(lái)源:電子技術(shù)應(yīng)用2012年第6期
張傳凱,馬少飛
北京萬(wàn)集科技股份有限公司,北京100085
摘要: 介紹了嵌入式Linux系統(tǒng)上vsftp的搭建和配置方法。給出了一種不使用Linux USB gadget driver API進(jìn)行復(fù)雜的驅(qū)動(dòng)開(kāi)發(fā)仍能方便快捷地訪(fǎng)問(wèn)嵌入式設(shè)備SD卡等多種外設(shè)的統(tǒng)一方法,并介紹了利用用戶(hù)權(quán)限來(lái)實(shí)現(xiàn)嵌入式設(shè)備受控訪(fǎng)問(wèn)的方法。
中圖分類(lèi)號(hào): TP399
文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2012)06-0018-02
A method of controlled access to embedded devices based on vsftp
Zhang Chuankai,Ma Shaofei
Beijing Wanji Technology Co., Ltd, Beijing 100085,China
Abstract: The paper indroduces the method of how to set up and configure vsftp on Linux system. Gives unified approach of access to the SD cards and other peripherals, avoiding the complex driven development using the Linux USB gadget driver API, and how to use the user permissions to achieve controlled access to embedded devices.
Key words : vsftp;embedded Linux;SD card;controlled access

    嵌入式設(shè)備與通用計(jì)算機(jī)相比,一般不具備像硬盤(pán)那樣大容量的存儲(chǔ)介質(zhì),大多使用閃存(NAND Flash)作為存儲(chǔ)介質(zhì)。對(duì)于采用Linux操作系統(tǒng)的嵌入式設(shè)備,64 MB的NAND Flash可以滿(mǎn)足Bootloader、內(nèi)核和文件系統(tǒng)的存放,如果使用過(guò)程中涉及大容量的數(shù)據(jù)讀寫(xiě),則多采用SD卡作為擴(kuò)展存儲(chǔ)介質(zhì)。這里的SD卡是指普通SD卡、MiniSD卡和MicroSD卡三種類(lèi)型的存儲(chǔ)卡。對(duì)SD卡上的數(shù)據(jù)進(jìn)行訪(fǎng)問(wèn)一般有兩種解決方法:(1)將SD卡從嵌入式設(shè)備中取出,使用特定的讀卡器連接到PC上進(jìn)行操作。這種方法需要用戶(hù)購(gòu)買(mǎi)特定的讀卡器,使用不方便,用戶(hù)也不愿意接受;(2)在嵌入式設(shè)備上增加一個(gè)USB從設(shè)備接口,為嵌入式設(shè)備開(kāi)發(fā)USB從設(shè)備驅(qū)動(dòng)(USB gadget driver),將SD卡模擬成U盤(pán)設(shè)備進(jìn)行訪(fǎng)問(wèn)。這種方法涉及到硬件的改動(dòng)和驅(qū)動(dòng)的開(kāi)發(fā),開(kāi)發(fā)難度大,耗費(fèi)時(shí)間長(zhǎng)。本文提供了一種方便快捷的方法,可以滿(mǎn)足用戶(hù)對(duì)SD卡上文件的訪(fǎng)問(wèn)。

    vsftp是一個(gè)基于GPL發(fā)布的類(lèi)Unix系統(tǒng)上使用的FTP服務(wù)器軟件,具有非常安全且快速穩(wěn)定的特點(diǎn),目前已經(jīng)被許多大型站點(diǎn)所采用。vsftp可以方便地移植到嵌入式Linux操作系統(tǒng)中,如果將嵌入式設(shè)備作為FTP服務(wù)器,以PC作為客戶(hù)端,用戶(hù)即可通過(guò)FTP客戶(hù)端軟件實(shí)現(xiàn)PC與嵌入式設(shè)備之間的文件傳輸。如果再將SD卡掛載到文件系統(tǒng)的某個(gè)目錄下,用戶(hù)就可通過(guò)FTP服務(wù)來(lái)訪(fǎng)問(wèn)SD卡。
1 移植vsftp到ARM-Linux系統(tǒng)
1.1 交叉編譯

    要移植vsftp,首先到vsftpd 官方網(wǎng)站下載程序源碼,本文使用的是vsftpd-2.3.4.tar.gz。解壓vsftpd-2.3.4.tar.gz,然后進(jìn)入vsftpd-2.3.4目錄,修改Makefile文件,將“CC=gcc”修改為“CC=/usr/local/arm/4.3.2/bin/arm-linux-gcc”,即使用交叉編譯器進(jìn)行編譯。執(zhí)行make指令,會(huì)出現(xiàn)“/lib/libcap.so.1: could not read symbols: File in wrong format”編譯錯(cuò)誤,提示找不到libcap.so.1庫(kù)文件,修改vsftpd-2.3.4目錄下的vsf_findlibs.sh文件,注釋掉如下語(yǔ)句:
    if locate_library /lib/libcap.so.1; then
       echo "/lib/libcap.so.1";
    elif locate_library /lib/libcap.so.2; then
       echo "/lib/libcap.so.2";
    else
       locate_library /usr/lib/libcap.so && echo "-lcap";
       locate_library /lib/libcap.so && echo "-lcap";
       locate_library /lib64/libcap.so && echo "-lcap";
    fi
    再次執(zhí)行make指令,編譯成功,生成vsftpd文件,執(zhí)行file vsftpd指令,則可顯示如下語(yǔ)句:
    vsftpd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked(uses shared libs), for GNU/Linux 2.6.14, stripped
    將vsftpd拷貝到嵌入式設(shè)備文件系統(tǒng)的/usr/sbin目錄下。
1.2 查看依賴(lài)及其相應(yīng)的配置文件
    執(zhí)行arm-linux-readelf –d vsftpd指令查看vsftpd需要的動(dòng)態(tài)鏈接庫(kù),則顯示如下語(yǔ)句:
Dynamic section at offset 0x16a9c contains 29 entries:
      Tag        Type            Name/Value
0x00000001 (NEEDED)        Shared library: [libcrypt.so.1]
0x00000001 (NEEDED)        Shared library: [libdl.so.2]
0x00000001 (NEEDED)        Shared library: [libnsl.so.1]
0x00000001 (NEEDED)        Shared library: [libresolv.so.2]
0x00000001 (NEEDED)        Shared library: [libutil.so.1]
0x00000001 (NEEDED)        Shared library: [libc.so.6]
    將以上所列的動(dòng)態(tài)庫(kù)從/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/lib目錄下拷貝到嵌入式設(shè)備文件系統(tǒng)的/lib目錄下;將vsftpd-2.3.4目錄下的默認(rèn)配置文件vsftpd.conf拷貝到嵌入式設(shè)備文件系統(tǒng)的/etc目錄下。
1.3 啟動(dòng)設(shè)置
    在嵌入式設(shè)備文件系統(tǒng)的/etc/rc.d/init.d目錄下添加名為vsftpd的腳本,內(nèi)容如下:
    #!/bin/sh
    base=vsftpd
    # See how we were called.
    case "$1" in
        start)
            /usr/sbin/$base
            ;;
       stop)
        pid=`/bin/pidof $base`
        if [ -n "$pid" ]; then
            kill -9 $pid
        fi
            ;;
    esac
    exit 0
    在/etc/init.d/rcS文件中添加/usr/sbin/vsftpd &語(yǔ)句,以便在開(kāi)機(jī)時(shí)啟動(dòng)vsftpd服務(wù)器。
2 用戶(hù)和目錄設(shè)置
    為了使用戶(hù)登錄FTP服務(wù)器后能夠直接進(jìn)入SD卡目錄中,需要對(duì)用戶(hù)及目錄進(jìn)行設(shè)置。vsftpd提供了匿名用戶(hù)、本地用戶(hù)、虛擬用戶(hù)三種訪(fǎng)問(wèn)方式。
    (1)匿名用戶(hù)形式:在默認(rèn)安裝的情況下,系統(tǒng)只提供匿名用戶(hù)訪(fǎng)問(wèn)。
    (2)本地用戶(hù)方式:以/etc/passwd中的用戶(hù)名為認(rèn)證方式。
    (3)虛擬用戶(hù)方式:支持將用戶(hù)名和口令保存在數(shù)據(jù)庫(kù)文件或數(shù)據(jù)庫(kù)服務(wù)器中。
    由于創(chuàng)建用戶(hù)較為麻煩,可以采用從host直接拷貝的方式,將/etc目錄下的passwd、passwd-、group、group-、shadow和shadow-文件拷貝到嵌入式設(shè)備文件系統(tǒng)的
/etc目錄下。
    執(zhí)行下面命令為訪(fǎng)問(wèn)SD的用戶(hù)創(chuàng)建一個(gè)本地用戶(hù),創(chuàng)建好之后就可以用admin登錄,并且其主目錄為/sdcard。這里使用/sdcard作為SD卡的掛載目錄。
    #adduser admin –h /sdcard -D
    #passwd 123456
    admin用戶(hù)存在的問(wèn)題就是可以對(duì)主目錄的上層目錄進(jìn)行訪(fǎng)問(wèn)。處于安全的考慮,大多數(shù)情況下需要對(duì)用戶(hù)隱藏掉系統(tǒng)文件以防止用戶(hù)的誤操作造成的系統(tǒng)崩潰。這就需要對(duì)admin用戶(hù)的權(quán)限進(jìn)行限制,使其只可訪(fǎng)問(wèn)/sdcard主目錄文件,其他文件都對(duì)用戶(hù)不可見(jiàn)。對(duì)vsftpd.conf配置文件做如下修改:
    chroot_local_user=NO
    chroot_list_enable=YES
    chroot_list_file=/etc/vsftpd.chroot_list
然后把a(bǔ)dmin用戶(hù)名添加到文件vsftpd.chroot_list中即可(一行一個(gè)用戶(hù)名)。vsftpd.chroot_list是一個(gè)用戶(hù)名列表,其中存放的是禁止訪(fǎng)問(wèn)上層目錄的用戶(hù)名。
3 訪(fǎng)問(wèn)SD卡
    使用網(wǎng)線(xiàn)連接嵌入式設(shè)備和PC,啟動(dòng)嵌入式設(shè)備,vsftpd服務(wù)器會(huì)在開(kāi)機(jī)過(guò)程中自啟動(dòng)。將嵌入式設(shè)備和PC的IP地址設(shè)置在同一網(wǎng)段,在PC端打開(kāi)FTP客戶(hù)端軟件,在服務(wù)器欄中輸入嵌入式設(shè)備的IP地址,使用用戶(hù)名和密碼進(jìn)行連接登錄??焖龠B接界面如圖1所示。

    登錄成功后,用戶(hù)將會(huì)看到如圖2所示的界面,從界面右側(cè)的地址欄可以看到/sdcard目錄已被作為用戶(hù)的根目錄/,用戶(hù)無(wú)法看到上層目錄的內(nèi)容,達(dá)到了使用戶(hù)受控訪(fǎng)問(wèn)的目的。

 

 

    實(shí)驗(yàn)測(cè)試表明,用戶(hù)可以方便地通過(guò)FTP客戶(hù)端軟件訪(fǎng)問(wèn)到SD卡,而且通過(guò)使用該方法,可以創(chuàng)建不同的用戶(hù),通過(guò)為其設(shè)定不同的主目錄,使用戶(hù)能夠?qū)η度胧皆O(shè)備的不同目錄進(jìn)行訪(fǎng)問(wèn)。如果用戶(hù)需要最高的權(quán)限,則可允許其他訪(fǎng)問(wèn)到嵌入式設(shè)備的所有目錄和文件,只要不將該用戶(hù)名添加到vsftpd.chroot_list中即可。這種靈活性是將嵌入式設(shè)備模擬成USB從設(shè)備難以做到的。
參考文獻(xiàn)
[1] CORBET J,RUBINI A,HARTMAN G K.Linux Device drivers[M].O’reilly Media,Inc,2005.
[2] 彭潁,王方.基于LINUX的VSFTPD服務(wù)的實(shí)現(xiàn)[J].信息系統(tǒng)工程,2010(10).
[3] 李傳偉,胡金春.嵌入式Linux下USB Gadget驅(qū)動(dòng)框架研究[J].航天控制,2006(3).
[4] 周余,王自強(qiáng),都思丹.Linux Gadget系統(tǒng)及其在S3c2410上的海量存儲(chǔ)研究[J].計(jì)算機(jī)應(yīng)用,2006(S2).

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。