FTP伺服器-vsftpd

前言:

vsftpd是Linux/Unix作業系統上常用的FTP伺服器軟體,它可以執行在諸如 Linux, BSD, Solaris, HP-UX 以及 IRIX 上面,支援很多其他的FTP 伺服器不支援的特徵。

vsfptd的配置十分簡單,本專題介紹vsfptd的簡單配置方法,並交代vsftpd中比較重要的虛擬使用者的配置過程。其餘小功能的實現可以對照文章列表中的“vsftpd配置檔案中常用選項的中文手冊”進行查詢。

實驗環境:

伺服器作業系統:CentOS 6.5
所用軟體包:vsftpd.x86_64 0:2.2.2-11.el6_4.1
客戶機作業系統:Windows 7
FTP客戶端:FileZilla

文章列表:

一、CentOS 6下使用vsftpd配置簡單FTP伺服器
二、為vsftpd配置虛擬使用者
三、vsftpd配置檔案中常用選項的中文手冊

常見問題的解決方案:

一、解決vsftpd虛擬使用者和系統使用者無法共存的問題
二、解決vsftpd登入時間過長的問題
三、使用匿名使用者登入vsftpd伺服器時提示:500 OOPS的解決方法
四、vsftpd配置虛擬使用者後登入提示530錯誤的解決方法

Python小程式-迭代輸出多層巢狀列表中的每個元素並顯示巢狀列表的層次結構

程式程式碼:

def iteration(list_name,indent = False,level = 0):
    '''此函式的作用是迭代輸出一個列表及其中的巢狀列表中的每個元素。
    其包含三個引數,第一個引數是要傳入的列表的名稱,第二個引數是控
    制是否使用縮排來顯示列表中的巢狀的層次結構,第三個引數是控制輸
    出時是否首行縮排,其數值就是使用Tab縮排的次數'''
    for i in list_name:
        if isinstance(i,list):
            iteration(i,indent,level + 1) #利用遞迴函式處理巢狀列表
        else:
            if indent:
                print('\t' * level,end='')
            print(i)
list1=['aa',['bb',['cc',['dd','ee']]],'ff'] #定義一個待處理的多層巢狀列表
iteration(list1,True,0) #呼叫iteration函式對其處理

程式輸出:

aa
    bb
        cc
            dd
            ee
ff

Python的異常處理機制

程式在執行時難免會因為各種“意外因素”或程式本身的邏輯問題導致出錯,嚴重時這將使程式徹底崩潰。解決這些問題常規的思路就是增加大量的邏輯判斷語句來消滅種種可能引起問題的“意外因素”,但這無疑會使程式程式碼變得複雜而龐大,並且十分脆弱。有沒有更好的解決辦法呢?如果沒有的話也不會有你看到的這篇文章了,哈哈哈~

可以在錯誤(Python中稱之為“異常”)產生時捕獲異常,並按照給定的異常恢復程式碼嘗試恢復異常。當然,如果你不捕獲異常,那麼當異常發生時,程式就必死無疑了。

先來看一個小程式。

給出一個文字檔案“file.txt”,檔案內容如下所示。要求:利用Python字串的split()方法來分別獲取每行字串中”:”兩邊的字元,以第一行字串為例,要求最終輸出為此形式:aa said: aaa

aa:aaa
bb:bbb
(ccc)
dd:ddd
ee:eee
ff:fff:fff

編寫程式如下。

file_data = open('file.txt','r',encoding='UTF-8')        #開啟"file.txt"檔案
for i in file_data:                 #利用for迴圈迭代讀取"file.txt"檔案的內容
    (a,b) = i.split(':',1)          #利用字串的split()方法,以":"為切割條件(只切割一次),對每行字串進行分割操作,最後將生成的列表中的兩個元素分別賦值給變數a、b。
    print(a,end = '')               #輸出變數a
    print(' said: ',end = '')       #輸出字串" said "
    print(b,end = '')               #輸出變數b
file_data.close()                   #關閉檔案

看似程式的邏輯上是沒有問題的,但是執行後會發現Python的直譯器丟擲瞭如下異常。

aa said: aaa               #按照程式中預設的邏輯正確輸出了處理後的字串
bb said: bbb               #正確輸出
Traceback (most recent call last):      #丟擲了一個Traceback型別的異常!!!
 File "./a.py", line 5, in <module>
 (aa,bb) = i.split(':',1)
ValueError: not enough values to unpack (expected 2, got 1)

上面的異常的內容大致是:沒有足夠的值來賦給變數,應該有兩個值,但現在只有一個。

檢視”file.txt”檔案的內容,可以發現,第三行的內容是:

(ccc)

這個字串中沒有包含“:”,理所當然的,split()方法並沒有將其切割為列表的兩個元素,所以在賦值時就產生了錯誤。

解決這個錯誤可以用邏輯判斷語句來針對特定的場景給出特定的解決方法(預防異常產生),如下:

file_data = open('file','r',encoding='UTF-8')
for i in file_data:
    if not i.find(':') == -1:        #增加一個判斷,只有當字串中包含“:”字元時才執行相關語句。
        (aa,bb) = i.split(':',1)
        print(a,end = '')
        print(' said: ',end = '')
        print(b,end = '')
file_data.close()

這種方法雖然能解決問題,但需要對每一種可能出現的錯誤情況給出特定的邏輯判斷語句及其他程式程式碼才能避免異常,這樣做的弊端是顯而易見的,畢竟且不論編寫這樣的程式碼有多麼繁瑣,光是考慮日後維護程式碼的工作量就已經令人窒息。

下面來看另一種解決方法:利用異常處理來解決此問題(允許異常產生,但會捕獲異常並進行修復)。

file_data = open('file','r',encoding='UTF-8')
for i in file_data:
    try:             #捕獲異常
        (a,b) = i.split(':',1)
        print(a,end = '')
        print(' said: ',end = '')
        print(b,end = '')
    except:          #給出修復異常的程式程式碼
        continue     #跳過本次迴圈
file_data.close()

程式正確執行並給出如下輸出:

aa said: aaa
bb said: bbb
dd said: ddd
ee said: eee
ff said: fff:fff

異常處理的工作原理就是像文章開頭說的那樣,捕獲一個異常,然後按照給定的恢復的程式碼來嘗試恢復異常,就這麼簡單。

上邊的例子中,我們捕獲了全部的異常,並對所有的異常應用了同一段恢復程式碼,那該如何針對某一型別的異常執行某一特定的恢復程式碼呢?

可以這樣寫,這裡只對IOError型別的錯誤應用恢復程式碼:

try :
    ...
except IOError:
    ...

以上介紹的就是Python的異常處理機制是簡單用法,異常處理的好處就是可以讓你能更加專注實現程式本身的功能,而不必費時費力的預先考慮各種可能產生的錯誤並寫出預防錯誤的相應的邏輯判斷及額外程式碼。

Python利用遞迴函式迭代輸出多層巢狀列表中的每個元素

Python的列表很強大也很靈活,如何運用好列表就是一門大學問啦!在列表中經常見到下面這種形式:

list1=['aa',['bb',['cc',['dd','ee']]],'ff']

如果使用for迴圈迭代輸出列表中的每個元素會得到下面的結果:

>>> list1=['aa',['bb',['cc',['dd','ee']]],'ff']
>>> for i in list1:
...    print(i)
...
aa
['bb', ['cc', ['dd', 'ee']]]
ff

可以看到,列表中巢狀的列表被整個當成一個元素輸出了出來,那麼該怎樣做才能將巢狀的列表中的每個元素單獨輸出出來呢?

先看一下常規的實現方法——for迴圈巢狀。

>>> list1=['aa',['bb',['cc',['dd','ee']]],'ff']
>>> for i in list1:
...     if isinstance(i,list):
...         for a in i:
...             print(a)
...     else:
...         print(i)
...
aa
bb
['cc', ['dd', 'ee']]
ff

上面的例子中可以看到,使用for迴圈巢狀一層之後列表中的第一層巢狀的列表中的每個元素成功被輸出出來了,但是第二層、第三層巢狀的列表中的每個元素依舊沒有被依次輸出。

這時候就需要用到for迴圈的多層巢狀了,但多層巢狀的for迴圈不僅寫起來繁瑣,讀起來更要命。有沒有其他更好的解決方法呢?當然有的——利用遞迴函式來輕鬆實現!

>>> list1=['aa',['bb',['cc',['dd','ee']]],'ff']
>>> def iteration(a):
...     for b in a:
...         if isinstance(b,list):
...             iteration(b)
...         else:
...             print(b)
...
>>> iteration(list1)
aa
bb
cc
dd
ee
ff

根據上面例子的輸出可以看到,完美實現了要求的功能。本文僅僅演示下如何利用遞迴函式來解決此類問題,不對其做詳細介紹。

CentOS 7下配置網絡卡資訊

1、編輯網絡卡配置檔案

CentOS 7的網絡卡命名規則與CentOS 6中的不一樣,下面列出CentOS 7中的網絡卡命名規則,只要瞭解即可,不必深究。

  • 規則1:如果Firmware或者BIOS提供的裝置索引資訊可用就用此命名。比如eno1。否則使用規則2
  • 規則2:如果Firmware或Bios的PCI-E擴充套件插槽可用就用此命名。比如ens1,否則使用規則3
  • 規則3:如果硬體介面的位置資訊可用就用此命名。比如enp2s0
  • 規則4:根據MAC地址命名,比如enx7d3e9f。預設不開啟。
  • 規則5:上述均不可用時迴歸傳統命名方式
  • 上面的所有命名規則需要依賴於一個安裝包:biosdevname

使用vim文字編輯器開啟網絡卡配置檔案,

[root@localhost home]# vi /etc/sysconfig/network-scripts/ifcfg-enp0s3

CentOS 7中的網絡卡配置資訊的寫法和CentOS 6中的也稍有不同,主要體現在:新加的各個選項後面都要加上一個“0”,不知為何~

以下為網絡卡完整配置資訊,新增及修改內容已著重標記(寫配置檔案的時候請不要把我加的註釋也寫上去=_=…)。

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static                           //IP獲取方式,由原來的dhcp修改為static(手動指定)
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp0s3
UUID=a7b862e4-5d61-468e-a6ab-31c7ee01d790
DEVICE=enp0s3
ONBOOT=yes                                //開機時是否啟用網絡卡,由原來的no改為yes
--------------------------------------------------------------------------------------------
                                     以下為新增的配置內容
--------------------------------------------------------------------------------------------
IPADDR0=192.168.162.27                    //配置IP地址,注意IPADDR後面有一個0
NETMASK0=255.255.255.0                    //配置子網掩碼,注意NETMASK後面有一個0
GATEWAY0=192.168.162.254                  //配置閘道器地址,注意GATEWAY後面有一個0
DNS1=114.114.114.114                      //配置首選DNS
DNS2=8.8.8.8                              //配置備用DNS

2、重啟網路

[root@localhost ~]# service network restart
Restarting network (via systemctl): [ OK ]

3、驗證配置

檢視網路配置資訊參考此篇文章。

https://www.ibadboy.net/archives/2099.html

驗證網路是否連通可以嘗試ping一下www.baidu.com。

[root@localhost home]# ping -c 4 www.baidu.com
PING www.a.shifen.com (61.135.169.121) 56(84) bytes of data.
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=1 ttl=54 time=19.3 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=2 ttl=54 time=19.4 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=3 ttl=54 time=19.5 ms
64 bytes from 61.135.169.121 (61.135.169.121): icmp_seq=4 ttl=54 time=19.6 ms
--- www.a.shifen.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3033ms
rtt min/avg/max/mdev = 19.396/19.508/19.674/0.107 ms

在區域網下則可以嘗試ping一下閘道器或同網段下的其他計算機,再或者ping自己的本地IP也行。。。

CentOS 7下檢視網路配置資訊

導語:

本文中介紹在CentOS 7下檢視IP、MAC、DNS、閘道器等常用網路配置資訊的方法

檢視網絡卡IP及MAC:

CentOS7中預設不提供ifconfig命令,那麼該如何檢視網絡卡資訊呢?

可以使用ip addr命令,如下所示:

[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
 inet 127.0.0.1/8 scope host lo
 valid_lft forever preferred_lft forever
 inet6 ::1/128 scope host
 valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
 link/ether 08:00:27:8d:54:2e brd ff:ff:ff:ff:ff:ff
 inet 192.168.162.27/24 brd 192.168.162.255 scope global enp0s3
 valid_lft forever preferred_lft forever
 inet6 fe80::26dd:b64f:6c1c:508f/64 scope link
 valid_lft forever preferred_lft forever

其中,lo為本地迴環網絡卡,enp0s3為第一塊網絡卡的名稱。

每塊網絡卡區域中,link後面跟的是網絡卡的MAC地址,inet後面跟的是該網絡卡的IP v4地址,inet6後面跟的是IP v6地址。

檢視DNS:

[root@localhost ~]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 114.114.114.114
nameserver 8.8.8.8

其中,每個nameserver關鍵字後面接的都是DNS地址,排在上方的優先順序高。

檢視閘道器:

[root@localhost ~]# ip route
default via 192.168.162.254 dev enp0s3 proto static metric 100
192.168.162.0/24 dev enp0s3 proto kernel scope link src 192.168.162.41 metric 100

default via後面接的就是閘道器地址,其後的dev後面接的是該閘道器所屬的網絡卡的名稱。

Linux下實現在指定目錄中遍歷所有檔案查詢指定字串

要實現此功能只要使用grep命令就好啦,具體可以看下下邊這個小例子:

查詢/home目錄及其子目錄中所有包含”hello”字串的檔案,並顯示出該字串在檔案中所處的行數。

[root@localhost ~]# grep -nR "hello" /home
/home/a:8:hello,world!
/home/b/a:10:hello,it7e!

grep命令相關引數介紹

  1. -n 是顯示行號
  2. -R 查詢所有檔案包含子目錄
  3. -i 忽略大小寫

minicom常用組合鍵介紹

minicom 組合鍵的用法是:先按Ctrl+A組合鍵,然後鬆開這兩個鍵,再按完成特定功能的按鍵。常用的功能按鍵如下

  • S鍵:傳送檔案到目標系統中;
  • W鍵:自動卷屏。當顯示的內容超過一行之後,自動將後面的內容換行。這個功能在檢視核心的啟動資訊時很有用;
  • C鍵:清除螢幕的顯示內容;
  • B鍵:瀏覽Minicom的歷史顯示;
  • X鍵:退出Minicom,會提示確認退出。

從新開始,全新啟程;潛心修煉,待到來日——再決雌雄!

人生總不可能是完美的,所以每個人都在不完美中努力追求著完美。
但追求的路上從沒有一帆風順,每當遇見坎坷和挫折的時候,就需要靜下心來思考自己從這次經歷中收穫了什麼。
一次挫折就是一次成長,不歷經挫折磨礪的人怎能在日後的生活中堅強勇敢呢?

今天,全新的站點風格、全新的目標、全新的認知、全新的心情……一切都是新的,從新開始,全新啟程。

兩年後,在《雲端計算技術與應用》專案的賽場上,希望我不會再留有遺憾!

未來,我來了!你準備好了嗎?

附加資訊

舊版站點風格:

2017年11月4日,改版後:

2017年山東省技能大賽《網路搭建與應用》專案落榜原因總結

應資訊科科長及我的指導老師的共同要求,在此,我對“2017年山東省技能大賽《網路搭建與應用》專案”未能得獎的原因僅做出個人主觀上的總結,併為解決每條“失敗原因”給出我個人的建議。

祝願威海水校在以後的該專案比賽中能取得滿意的成績。

落榜原因:

  1. 備賽時間不足:僅半年備賽時間。而外校則普遍無雙休及寒暑假,並至少訓練一年以上
  2. 指導教師備賽經驗不足:完全無經驗,指導教師間不能形成默契的配合,無統一的備賽方案及教學計劃,導致訓練任務雜碎選手注意力無法集中
  3. 指導教師參賽經驗不足:完全無經驗,比賽時選住的酒店房間靠近馬路,選手晚上無法好好休息
  4. 賽前模擬練習不夠:無老師統一組織模擬訓練,選手自發組織的能力十分差勁,導致長期“各幹各的”最後比賽時配合的一塌糊塗
  5. 缺乏參考資料與訓練試題:網路部分參考資料只有產品說明文件,伺服器部分參考資料在網際網路上現用現查,訓練試題全是八九年前甚至十年前的老舊市賽題目
  6. 選手做完的模擬試題無人檢查:選手做完題後往往自我感覺良好,實際上會存在很多問題,亟待老師發現並予以更正
  7. 缺乏教師指導且學校不夠重視:學校不給予賽項指導教師經濟上的獎勵與精神上的激勵,加之教師日常雜事較多,嚴重影響指導教師的備賽積極性
  8. 選手個人素質較差(此處不針對個人,是所有選手缺點的總結):倉促應賽,無充足生源供選拔選手。臨時選拔的選手學習能力差、自制力差、獨立思考的能力差、心理素質差、存在交流障礙
  9. 同批次的“後備小組”嚴重影響訓練:打遊戲、喧譁等影響參賽小組備賽
  10. 我個人的心理問題(李海亮老師建議補充):把比賽看得過重,導致賽前一晚外面越吵我越焦躁,難以入眠,很大程度上影響了第二天比賽的發揮

解決以上問題的個人建議:

備賽時間不足

在學生入學的第一學年起即開始選拔參賽選手,按照大賽規定:任意一級學生均可參加大賽,且可跨年級組隊。對有能力的學生可以從第一學年入學起就選入技能小組培訓一年,第二學年直接參賽,若未得獎,則該生可繼續在第三學年參賽,此時獲獎機率大大提升。

指導教師備賽及參賽經驗不足

這裡主要靠指導教師的個人經驗積累。

賽前模擬訓練不夠(此處再次宣告:所述建議僅代表個人看法)

基礎訓練進行一段時間,待兩名參賽選手都對各自所負責的部分的知識有了初步認識後,指導教師即可將兩名參賽選手放在一起進行試題的模擬訓練,透過做正規賽題一點一點磨合知識點及選手間的配合,從而提高答題速度及做題的得分率。

網路部分若按照神州數碼官方給出的實驗手冊一個一個做,愚以為是出力不討好的事。畢竟基礎實驗的數量很大,每個實驗中包含的知識點又很少很零碎,但完成每個實驗均需重新連線及做基礎配置,極度浪費時間。不如直接做賽題,在一次基礎配置做完後可以很方便的在其上配置各種細節功能,一次生二次熟,每份賽題經過多次的重複做,知識點也就掌握的差不多了。這方面,前期需要指導教師為選手整理出各個賽題的參考答案,以方便選手對知識點的學習,避免選手把時間浪費在“扣題”上。

做題的另一個好處是:每年的市賽及省賽都會有很多往年的原題,除國賽外很少會完全自主出題,其考察的知識點也基本不超出歷年國賽的知識範圍,能熟練完成14年以後的所有國賽題,且選手間配合無誤,至少省賽二等獎。

缺乏參考資料與訓練試題

獲取賽題及資料有多種途徑,這裡指導老師與我共同收集了14年至17年共13份國賽賽題(15年十份),其中11份帶參考答案;17年兩市市賽題,均帶參考答案;16年山東省賽題,無參考答案。

注:收集上述賽題時已距比賽開始不滿10天,完全無時間練習。
以上所有賽題及參考答案均已上傳至網路小組QQ群中。

我的個人網站:https://www.ibadboy.net(百度搜:壞蛋的部落格)中也有很多關於大賽中涉及到的各種服務的搭建及問題處理的文章,可供參考。此外,我會將每個服務都單獨寫成一個專題,專題中集中羅列該服務的各種功能實現的方法及常見問題處理的方法,專題文章列表的URL:https://www.ibadboy.net/archives/category/special

同時,建議水校多與外校交流,可以適當派選手到外校“拉練”,在交流過程中互相學習經驗及交換學習資料。

選手做完的模擬試題無人檢查

指導教師日常雜事繁重,然而檢查試題所用時間卻遠遠超出做一份題所用的時間(測試及論證費時費力)。在學校不給予指導教師“特殊照顧”的情況下教師很難做到選手做一份題就檢查一份題。

缺乏教師指導且學校不夠重視

涉及學校政策及其他因素,不敢妄議。

選手個人素質較差

增加選拔選手的生源範圍,可跨年級,並從所有計算機專業的學生中選拔選手。

按大賽規定:只要選手在同一所學校即可,無論年級與班級,且同一選手只要未在國賽得獎,便可重複參賽。

同批次“後備小組”嚴重影響訓練

建議取消同批次參賽隊的“後備小組”。《網路搭建與應用》專案備賽過程枯燥,且難度較大,而中職學生普遍學習能力差且自控能力弱,兩個年紀能找到兩個合適的人進行組隊已實屬不易,盲目湊人數最後的結果往往是在沒有老師的情況下學生們結伴扯閒話及打遊戲,非常影響正常的訓練。

這裡著重解釋下(如果有合適人選):一年級選拔一個選手,二年級選拔一個選手,兩個選手同時訓練。比賽後,二年級學生已升入三年級,無法再次參加比賽,而一年級選手升入二年級,此時其擁有一次比賽經驗,在下次新生入學時可再為其挑選一名合適的隊友組隊比賽,得獎機率大大提升。

最後,再次祝願威海水校在日後的該專案比賽中能節節攀升,奪得一等獎!

總結人:威海水校資訊科2015級學生——孫錫源

日期:2017年11月2日

個人網站:https://www.ibadboy.net

附件:

2017年山東省技能大賽《網路搭建與應用》專案落榜原因總結