博客

  • Cisco路由器的安全配置簡易方案

     壹,路由器訪問控制的安全配置
    1,嚴格控制可以訪問路由器的管理員。任何壹次維護都需要記錄備案。
    2,建議不要遠程訪問路由器。即使需要遠程訪問路由器,建議使用訪問控制列表和高強度的密碼控制。
    3,嚴格控制CON端口的訪問。具體的措施有:
    A,如果可以開機箱的,則可以切斷與CON口互聯的物理線路。
    B,可以改變默認的連接屬性,例如修改波特率(默認是96000,可以改爲其他的)。
    C,配合使用訪問控制列表控制對CON口的訪問。
    如:Router(Config)#Access-list 1 permit 192.168.0.1
        Router(Config)#line con 0
        Router(Config-line)#Transport input none
        Router(Config-line)#Login local
        Router(Config-line)#Exec-timeoute 5 0
        Router(Config-line)#access-class 1 in
        Router(Config-line)#end
    D,給CON口設置高強度的密碼。
    4,如果不使用AUX端口,則禁止這個端口。默認是未被啓用。禁止如:
      Router(Config)#line aux 0
      Router(Config-line)#transport input none
      Router(Config-line)#no exec
    5,建議采用權限分級策略。如:
    Router(Config)#username BluShin privilege 10 G00dPa55w0rd
    Router(Config)#privilege EXEC level 10 telnet
    Router(Config)#privilege EXEC level 10 show ip access-list
    6,爲特權模式的進入設置強壯的密碼。不要采用enable password設置密碼。而要采用enable secret命令設置。並且要啓用Service password-encryption。
    7,控制對VTY的訪問。如果不需要遠程訪問則禁止它。如果需要則壹定要設置強壯的密碼。由于VTY在網絡的傳輸過程中爲加密,所以需要對其進行嚴格的控制。如:設置強壯的密碼;控制連接的並發數目;采用訪問列表嚴格控制訪問的地址;可以采用AAA設置用戶的訪問控制等。
    8,IOS的升級和備份,以及配置文件的備份建議使用FTP代替TFTP。如:
    Router(Config)#ip ftp username BluShin
    Router(Config)#ip ftp password 4tppa55w0rd
    Router#copy startup-config ftp:
    9,及時的升級和修補IOS軟件。
    [page]

    二,路由器網絡服務安全配置
    1,禁止CDP(Cisco Discovery Protocol)。如:
      Router(Config)#no cdp run
      Router(Config-if)# no cdp enable
    2,禁止其他的TCP、UDP Small服務。
      Router(Config)# no service tcp-small-servers
      Router(Config)# no service udp-samll-servers
    3,禁止Finger服務。
      Router(Config)# no ip finger
      Router(Config)# no service finger
    4,建議禁止HTTP服務。
      Router(Config)# no ip http server
    如果啓用了HTTP服務則需要對其進行安全配置:設置用戶名和密碼;采用訪問列表進行控制。如:
    Router(Config)# username BluShin privilege 10 G00dPa55w0rd
    Router(Config)# ip http auth local
    Router(Config)# no access-list 10
    Router(Config)# access-list 10 permit 192.168.0.1
    Router(Config)# access-list 10 deny any
    Router(Config)# ip http access-class 10
    Router(Config)# ip http server
    Router(Config)# exit
    5,禁止BOOTp服務。
      Router(Config)# no ip bootp server
    禁止從網絡啓動和自動從網絡下載初始配置文件。
      Router(Config)# no boot network
      Router(Config)# no servic config
    6,禁止IP Source Routing。
      Router(Config)# no ip source-route
    7,建議如果不需要ARP-Proxy服務則禁止它,路由器默認識開啓的。
      Router(Config)# no ip proxy-arp
      Router(Config-if)# no ip proxy-arp
    8,明確的禁止IP Directed Broadcast。
      Router(Config)# no ip directed-broadcast
    9,禁止IP Classless。
      Router(Config)# no ip classless
    10,禁止ICMP協議的IP Unreachables,Redirects,Mask Replies。
      Router(Config-if)# no ip unreacheables
      Router(Config-if)# no ip redirects
      Router(Config-if)# no ip mask-reply
    11,建議禁止SNMP協議服務。在禁止時必須刪除壹些SNMP服務的默認配置。或者需要訪問列表來過濾。如:
      Router(Config)# no snmp-server community public Ro
      Router(Config)# no snmp-server community admin RW
      Router(Config)# no access-list 70
      Router(Config)# access-list 70 deny any
      Router(Config)# snmp-server community MoreHardPublic Ro 70
      Router(Config)# no snmp-server enable traps
      Router(Config)# no snmp-server system-shutdown
      Router(Config)# no snmp-server trap-anth
      Router(Config)# no snmp-server
      Router(Config)# end
    12,如果沒必要則禁止WINS和DNS服務。
      Router(Config)# no ip domain-lookup
      如果需要則需要配置:
      Router(Config)# hostname Router
      Router(Config)# ip name-server 202.102.134.96
    13,明確禁止不使用的端口。
      Router(Config)# interface eth0/3
      Router(Config)# shutdown
    [page]

    三,路由器路由協議安全配置
    1,首先禁止默認啓用的ARP-Proxy,它容易引起路由表的混亂。
    Router(Config)# no ip proxy-arp 或者
    Router(Config-if)# no ip proxy-arp
    2,啓用OSPF路由協議的認證。默認的OSPF認證密碼是明文傳輸的,建議啓用MD5認證。並設置壹定強度密鑰(key,相對的路由器必須有相同的Key)。
      Router(Config)# router ospf 100
    Router(Config-router)# network 192.168.100.0 0.0.0.255 area 100
    ! 啓用MD5認證。
    ! area area-id authentication 啓用認證,是明文密碼認證。
    !area area-id authentication message-digest
    Router(Config-router)# area 100 authentication message-digest
    Router(Config)# exit
    Router(Config)# interface eth0/1
    !啓用MD5密鑰Key爲routerospfkey。
    !ip ospf authentication-key key 啓用認證密鑰,但會是明文傳輸。
    !ip ospf message-digest-key key-id(1-255) md5 key
    Router(Config-if)# ip ospf message-digest-key 1 md5 routerospfkey
    3,RIP協議的認證。只有RIP-V2支持,RIP-1不支持。建議啓用RIP-V2。並且采用MD5認證。普通認證同樣是明文傳輸的。
    Router(Config)# config terminal
    ! 啓用設置密鑰鏈
    Router(Config)# key chain mykeychainname
    Router(Config-keychain)# key 1
    !設置密鑰字串
    Router(Config-leychain-key)# key-string MyFirstKeyString
    Router(Config-keyschain)# key 2
    Router(Config-keychain-key)# key-string MySecondKeyString
    !啓用RIP-V2
    Router(Config)# router rip
    Router(Config-router)# version 2
    Router(Config-router)# network 192.168.100.0
    Router(Config)# interface eth0/1
    ! 采用MD5模式認證,並選擇已配置的密鑰鏈
    Router(Config-if)# ip rip authentication mode md5
    Router(Config-if)# ip rip anthentication key-chain mykeychainname
    4,啓用passive-interface命令可以禁用壹些不需要接收和轉發路由信息的端口。建議對于不需要路由的端口,啓用passive-interface。但是,在RIP協議是只是禁止轉發路由信息,並沒有禁止接收。在OSPF協議中是禁止轉發和接收路由信息。
    ! Rip中,禁止端口0/3轉發路由信息
    Router(Config)# router Rip
    Router(Config-router)# passive-interface eth0/3
    !OSPF中,禁止端口0/3接收和轉發路由信息
    Router(Config)# router ospf 100
    Router(Config-router)# passive-interface eth0/3
    5,啓用訪問列表過濾壹些垃圾和惡意路由信息,控制網絡的垃圾信息流。
    Router(Config)# access-list 10 deny 192.168.1.0 0.0.0.255
    Router(Config)# access-list 10 permit any
    ! 禁止路由器接收更新192.168.1.0網絡的路由信息
    Router(Config)# router ospf 100
    Router(Config-router)# distribute-list 10 in
    !禁止路由器轉發傳播192.168.1.0網絡的路由信息
    Router(Config)# router ospf 100
    Router(Config-router)# distribute-list 10 out
    6,建議啓用IP Unicast Reverse-Path Verification。它能夠檢查源IP地址的准確性,從而可以防止壹定的IP Spooling。但是它只能在啓用CEF(Cisco Express Forwarding)的路由器上使用。
    Router# config t
    ! 啓用CEF
    Router(Config)# ip cef
    !啓用Unicast Reverse-Path Verification
    Router(Config)# interface eth0/1
    Router(Config)# ip verify unicast reverse-path

    四,路由器其他安全配置
    1,及時的升級IOS軟件,並且要迅速的爲IOS安裝補丁。
    2,要嚴格認真的爲IOS作安全備份。
    3,要爲路由器的配置文件作安全備份。
    4,購買UPS設備,或者至少要有冗余電源。
    5,要有完備的路由器的安全訪問和維護記錄日志。
    6,要嚴格設置登錄Banner。必須包含非授權用戶禁止登錄的字樣。
    7,IP欺騙得簡單防護。如過濾非公有地址訪問內部網絡。過濾自己內部網絡地址;回環地址(127.0.0.0/8);RFC1918私有地址;DHCP自定義地址(169.254.0.0/16);科學文檔作者測試用地址(192.0.2.0/24);不用的組播地址(224.0.0.0/4);SUN公司的古老的測試地址(20.20.20.0/24;204.152.64.0/23);全網絡地址(0.0.0.0/8)。
    Router(Config)# access-list 100 deny ip 192.168.0.0 0.0.0.255 any log
    Router(Config)# access-list 100 deny ip 127.0.0.0 0.255.255.255 any log
    Router(Config)# access-list 100 deny ip 192.168.0.0 0.0.255.255 any log
    Router(Config)# access-list 100 deny ip 172.16.0.0 0.15.255.255 any log
    Router(Config)# access-list 100 deny ip 10.0.0.0 0.255.255.255 any log
    Router(Config)# access-list 100 deny ip 169.254.0.0 0.0.255.255 any log
    Router(Config)# access-list 100 deny ip 192.0.2.0 0.0.0.255 any log
    Router(Config)# access-list 100 deny ip 224.0.0.0 15.255.255.255 any
    Router(Config)# access-list 100 deny ip 20.20.20.0 0.0.0.255 any log
    Router(Config)# access-list 100 deny ip 204.152.64.0 0.0.2.255 any log
    Router(Config)# access-list 100 deny ip 0.0.0.0 0.255.255.255 any log
    8,建議采用訪問列表控制流出內部網絡的地址必須是屬于內部網絡的。如:
    Router(Config)# no access-list 101
    Router(Config)# access-list 101 permit ip 192.168.0.0 0.0.0.255 any
    Router(Config)# access-list 101 deny ip any any log
    Router(Config)# interface eth 0/1
    Router(Config-if)# description “internet Ethernet”
    Router(Config-if)# ip address 192.168.0.254 255.255.255.0
    Router(Config-if)# ip access-group 101 in
    9,TCP SYN的防範。如:
    A: 通過訪問列表防範。
    Router(Config)# no access-list 106
    Router(Config)# access-list 106 permit tcp any 192.168.0.0 0.0.0.255 established
    Router(Config)# access-list 106 deny ip any any log
    Router(Config)# interface eth 0/2
    Router(Config-if)# description “external Ethernet”
    Router(Config-if)# ip address 192.168.1.254 255.255.255.0
    Router(Config-if)# ip access-group 106 in
    B:通過TCP截獲防範。(這會給路由器産生壹定負載)
    Router(Config)# ip tcp intercept list 107
    Router(Config)# access-list 107 permit tcp any 192.168.0.0 0.0.0.255
    Router(Config)# access-list 107 deny ip any any log
    Router(Config)# interface eth0
    Router(Config)# ip access-group 107 in
    10,LAND.C 進攻的防範。
    Router(Config)# access-list 107 deny ip host 192.168.1.254 host 192.168.1.254 log
    Router(Config)# access-list permit ip any any
    Router(Config)# interface eth 0/2
    Router(Config-if)# ip address 192.168.1.254 255.255.255.0
    Router(Config-if)# ip access-group 107 in
    11,Smurf進攻的防範。
    Router(Config)# access-list 108 deny ip any host 192.168.1.255 log
    Router(Config)# access-list 108 deny ip any host 192.168.1.0 log
    12,ICMP協議的安全配置。對于進入ICMP流,我們要禁止ICMP協議的ECHO、Redirect、Mask request。也需要禁止TraceRoute命令的探測。對于流出的ICMP流,我們可以允許ECHO、Parameter Problem、Packet too big。還有TraceRoute命令的使用。
    ! outbound ICMP Control
    Router(Config)# access-list 110 deny icmp any any echo log
    Router(Config)# access-list 110 deny icmp any any redirect log
    Router(Config)# access-list 110 deny icmp any any mask-request log
    Router(Config)# access-list 110 permit icmp any any
    ! Inbound ICMP Control
    Router(Config)# access-list 111 permit icmp any any echo
    Router(Config)# access-list 111 permit icmp any any Parameter-problem
    Router(Config)# access-list 111 permit icmp any any packet-too-big
    Router(Config)# access-list 111 permit icmp any any source-quench
    Router(Config)# access-list 111 deny icmp any any log
    ! Outbound TraceRoute Control
    Router(Config)# access-list 112 deny udp any any range 33400 34400
    ! Inbound TraceRoute Control
    Router(Config)# access-list 112 permit udp any any range 33400 34400
    13,DDoS(Distributed Denial of Service)的防範。
    ! The TRINOO DDoS system
    Router(Config)# access-list 113 deny tcp any any eq 27665 log
    Router(Config)# access-list 113 deny udp any any eq 31335 log
    Router(Config)# access-list 113 deny udp any any eq 27444 log
    ! The Stacheldtraht DDoS system
    Router(Config)# access-list 113 deny tcp any any eq 16660 log
    Router(Config)# access-list 113 deny tcp any any eq 65000 log
    ! The TrinityV3 System
    Router(Config)# access-list 113 deny tcp any any eq 33270 log
    Router(Config)# access-list 113 deny tcp any any eq 39168 log
    ! The SubSeven DDoS system and some Variants
    Router(Config)# access-list 113 deny tcp any any range 6711 6712 log
    Router(Config)# access-list 113 deny tcp any any eq 6776 log
    Router(Config)# access-list 113 deny tcp any any eq 6669 log
    Router(Config)# access-list 113 deny tcp any any eq 2222 log
    Router(Config)# access-list 113 deny tcp any any eq 7000 log
    13,建議啓用SSH,廢棄掉Telnet。但只有支持並帶有IPSec特征集的IOS才支持SSH。並且IOS12.0-IOS12.2僅支持SSH-V1。如下配置SSH服務的例子:
    Router(Config)# config t
    Router(Config)# no access-list 22
    Router(Config)# access-list 22 permit 192.168.0.22
    Router(Config)# access-list deny any
    Router(Config)# username BluShin privilege 10 G00dPa55w0rd
    ! 設置SSH的超時間隔和嘗試登錄次數
    Router(Config)# ip ssh timeout 90
    Router(Config)# ip ssh anthentication-retries 2
    Router(Config)# line vty 0 4
    Router(Config-line)# access-class 22 in
    Router(Config-line)# transport input ssh
    Router(Config-line)# login local
    Router(Config-line)# exit
    !啓用SSH服務,生成RSA密鑰對。
    Router(Config)# crypto key generate rsa
    The name for the keys will be: router.blushin.org
    Choose the size of the key modulus in the range of 360 to 2048 for your General Purpose Keys .Choosing a key modulus greater than 512 may take a few minutes.
    How many bits in the modulus[512]: 2048
    Generating RSA Keys…
    [OK]
    Router(Config)#

  • Cisco路由器配置信息及口令的清除

    在網絡日常管理與維護的工作中,妳是否遇到過這種現象:由于忘記了口令,妳被原來親切的“朋友”——路由器或交換機強行拒于門外,無法進行參數的重新設置、信息統計。下面就針對幾種常見而重要的網絡設備的口令清除方法談談本人的壹點“小竅門”。 

      Cisco 路由器配置信息及口令的清除 

      適用範圍:所有IOS在10.0及以上版本的Cisco 2000、2500、3000、4000、7000系列路由器。 
      
      清除步驟如下: 
      
      1.用路由器所帶的串口線連接到Console口,以下通過Win95的超級終端進行; 
      
      2.路由器加電後60秒內,按下CTRL(如果不行按CTRL-BREAK)鍵,等待出現“〉”提示符; 
      
      3.鍵入“〉e/s 2000002”命令,並記錄下返回值,用在後面“Router(config)#config-register 0x2102”命令中;(通常返回值是2102) 
      
      4.在“〉”符號後鍵入“o/r 0x42”; 
      
      5.鍵入“i”, 路由器將重新初始化,對于出現的提示問題,回答No; 
      
      6.鍵入“Enable”(沒有口令,按回車即可); 
      
      7.改變口令(無論是否加密): 
      
      a. 輸入“config mem”或“copy startup-config mem”; 
      
      b. 輸入“write”; 
      
      c. 輸入“config term”並輸入“enable secret〈password〉”和“enable password〈password〉”,改變口令; 
      
      8.去掉用戶提示及口令: 
      
      a.進入虛擬行配置模式,輸入“line vty 0 4”; 
      
      b.輸入“password〈password〉”,改變口令; 
      
      c.輸入“login”(可以去掉用戶提示,原來是login local); 
      
      9.完成後按Ctrl-z結束; 
      
      10.輸入“write”保存所做的改變; 
      
      11.進入特權配置模式,鍵入“config-register 0x2102”(注意,必須完成此步); 
      
      12.Write保存配置信息; 
      
      13.退出配置模式,Reload完成重新啓動路由器即可。 
      
      說明:o/r 0x42是從Flash中引導路由器,如果不成功,可采用o/r 0x41從ROM中引導路由器,其余操作與o/r 0x42相同,但是最好只在Flash引導不成功或Flash內容被刪除、沒有Flash情況下才用。使用0x41只能查看或刪除配置信息而不能更改口令。 
      
      
      Cisco Catalyst 3000配置信息的清除 
      
      
      1.在交換機加電啓動時,按住交換機後面板上的Sys Req按鈕5秒鍾,然後松開; 
      
      2.進入配置選單,選擇“Clear Non-Volatile RAM”,即可清除交換機的所有配置信息(包括口令)。 
      
      3.根據需要,重新配置參數、口令等。 
      
      Intel Express交換機口令的清除 
      
      適用範圍:Intel Express 10 Switch/10 Switch+/100FX Switch交換機 
      
      方法壹: 
      
      1.進入交換機的維護模式(Maintenance Mode),輸入:run defparm,以重啓交換機,把原來的配置變成原始默認設置(原始默認沒有口令)。 
      
      2.進入維護模式: 
      
      a.關閉交換機後按下面板上的Maint按鈕,然後給交換機加電; 
      
      b.按下按鈕保持3秒鍾至System LED 綠色燈快速閃爍; 
      
      c.釋放Maint按鈕。 
      
      3.通過交換機的串口,用直連式串口線以9600/N/8/1,兼容VT100的終端模式進入交換機; 
      
      4.按Enter鍵,直到屏幕上出現命令行提示。 
      
      方法二:利用Intel交換機的後門 
      
      Telnet登錄到交換機上,提示輸入用戶名時,隨便輸入壹個,然後輸入通用的口令“debug”,即可進入交換機。 
      
      3COM NetServer遠程訪問服務器 
      
      口令的清除 
      
      查看NetServer Configuration DIP開關,它控制NetServer的硬件配置信息。其中DIP4控制“Erase/Reinitialize Flash Configuration”。 
      
      清除步驟如下: 
      
      1.把DIP4撥到ON狀態,當NETServer啓動時,保于Flash的配置信息將會被刪除; 
      
      2.關閉機器再把DIP4撥到OFF,加電啓動,然後就可以重新配置了。

  • 將Linux變成路由器

    Linux系統是一個強大的網絡操作系統,本身就是一個出色的路由器,只要經過非常少的幾步設置,就會使用LINUX系統本身成為一台出色的路由器。
    要想使LINUX系統達到這種目的,首先得查看Linux系統的內核中是否打開了IP轉發功能,可以通過下列命令來查看:
    # cat /proc/sys/net/ip_forward
    如果用此命令返回的結果是0,那麼就表明Linux內核沒有啟用IP轉發功能。就可以通過下示命令來啟用:
    # echo 1 > /proc/sys/net/ip_forward
    但這種方式只能保證當次有效,如果你不小心或應某種需要重啟了系統,那麼又得重新輸入上述這個命令一次。因此,為了保證每次系統都能自動設置,你就可以用VI編輯器打開/etc/sysctl.conf配置文件,在此配置文件中加如下容:
    ipv_ipforward=1
    保存退出後,這樣,每次重啟系統都不用重新設置內核IP轉發了。
    在打開內核IP轉發功能後,我們就該為我們所假設的網絡添加路由功能了。
    在LINUX系統下實現路由功能,兩種方法來實現,一種是通過IPTABLES工具的NAT轉發功能,一種是使用IPROUTER2工具集中的IP ROUTE命令子集來實現。這兩種方法各有優缺點,使用哪種方法,主要看你所在的網絡使用哪種方法連接互聯網。 IPTABLES工具適合動態IP地址以及固定公網IP地址方式,同時,還提供了網絡地址轉換功能,此功能不僅能使使用私有IP地址的內網PC連接上互聯網,而且還提供外網能過DNAT功能訪問處於內網中的各種網絡服務,以用隱藏內容IP網絡段,增加了安全性。 IP ROUTE工具同樣適應與IPTABELS相同的兩種上網方式,但不能提供NAT功能。
    不過,有許多特殊的網絡路由功能,是通過這兩個工具共同合作的才能實現的,例如,將要講到的策略路由、負載均衡、多WAN出口路由等。因此,筆者在此分別列出這個工具實現路由功能的命令內容,其後,在介紹如何通過這兩個工具合作,完成更加高級的功能。
    1、IPTABLES工具的NAT方式開啟LINUX路由功能,其通過動態拔號方式連接互聯網的命令如下所示:
    # iptables –t nat –A POSTROUTING –d 192.168.1.0/24 –s 0/0 –o ppp0 –j MASQUERD
    其中,ppp0是你拔號網絡接口別名,在此之前,你得先設置好與拔號相關的內容,這可以通過直接編輯/etc/sysconfig/network_scripts/ifcfg_ppp0配置文件來達到目的。
    通過固定公網IP地址方式連接互聯的實現方法如下:
    # iptables –t nat –A POSTROUTING –s 192.168.1.0/24 -j SNAT –to 202.103.224.58
    其中,這個固定公網IP地址是由當地ISP分配給你的,在這也是由筆者自行假設的,具體的IP地址得根據你所在ISP所在地來決定。
    2、通過IP ROUTE工具來實現LINUX系統的路由功能
    通過動態拔號上網方式連接互聯網的命令如下所示產:
    # ip route add via ppp0 dev eth0
    通過固定公網IP連接互聯網的命令如下所示:
    # ip route add via 202.103.224.58 dev eth0
    經過以上兩種方法中的任何一種的設置,我們的LINUX系統就具有路由功能了。這樣,所處在局域網內部的PC都能夠通過這台LINUX路由器共享上網了,便前題條件是要設置這些局域網中的PC的IP地址為此IP地址段中的任何一個,但不能相同,192.168.1.2-192.168.1.254,同時,設置它們的網關地址全部為192.168.1.1,這是LINUX路由器中連接局域網網卡的IP地址。因為,在這裡全部使用固定IP地址,沒有使用DHCP服務器,因此,這此IP地址都必需由用戶自行指定的。

  • Java基礎:關於Java編程語言中的內部類說明

    提起Java內部類(Inner Class)可能很多人不太熟悉,實際上類似的概念在C++裡也有,那就是嵌套類(Nested Class),關於這兩者的區別與聯繫,在下文中會有對比。內部類從表面上看,就是在類中又定義了一個類(下文會看到,內部類可以在很多地方定義),而實際上並沒有那麼簡單,乍看上去內部類似乎有些多餘,它的用處對於初學者來說可能並不是那麼顯著,但是隨著對它的深入了解,你會發現Java的設計者在內部類身上的確是用心良苦。學會使用內部類,是掌握Java高級編程的一部分,它可以讓你更優雅地設計你的程序結構。下面從以下幾個方面來介紹:

    第一次見面

    public interface Contents {

    int value();

    }

    public interface Destination {

    String readLabel();

    }

    public class Goods {

    private class Content implements Contents {

    private int i = 11;

    public int value() {

    return i;

    }

    }

    protected class GDestination implements Destination {

    private String label;

    private GDestination(String whereTo) {

    label = whereTo;

    }

    public String readLabel() {

    return label;

    }

    }

    public Destination dest(String s) {

    return new GDestination(s);

    }

    public Contents cont() {

    return new Content();

    }

    }

    class TestGoods {

    public static void main(String[] args) {

    Goods p = new Goods();

    Contents c = p.cont();

    Destination d = p.dest(“Beijing”);

    }

    }

    在這個例子裡類Content和GDestination被定義在了類Goods內部,並且分別有著protected和private修飾符來控制訪問級別。 Content代表著Goods的內容,而GDestination代表著Goods的目的地。它們分別實現了兩個接口Content和Destination。在後面的main方法裡,直接用Contents c和Destination d進行操作,你甚至連這兩個內部類的名字都沒有看見!這樣,內部類的第一個好處就體現出來了??隱藏你不想讓別人知道的操作,也即封裝性。

    同時,我們也發現了在外部類作用範圍之外得到內部類對象的第一個方法,那就是利用其外部類的方法創建並返回。上例中的cont()和dest()方法就是這麼做的。那麼還有沒有別的方法呢?當然有,其語法格式如下:

    outerObject=new outerClass(Constructor Parameters);

    outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters);

    注意在創建非靜態內部類對象時,一定要先創建起相應的外部類對象。至於原因,也就引出了我們下一個話題??非靜態內部類對像有著指向其外部類對象的引用,對剛才的例子稍作修改:

    public class Goods {

    private valueRate=2;

    private class Content implements Contents {

    private int i = 11*valueRate;

    public int value() {

    return i;

    }

    }

    protected class GDestination implements Destination {

    private String label;

    private GDestination(String whereTo) {

    label = whereTo;

    }

    public String readLabel() {

    return label;

    }

    }

    public Destination dest(String s) {

    return new GDestination(s);

    }

    public Contents cont() {

    return new Content();

    }

    }

    修改的部分用藍色顯示了。在這裡我們給Goods類增加了一個private成員變量valueRate,意義是貨物的價值係數,在內部類Content的方法value()計算價值時把它乘上。我們發現,value()可以訪問valueRate,這也是內部類的第二個好處??一個內部類對象可以訪問創建它的外部類對象的內容,甚至包括私有變量!這是一個非常有用的特性,為我們在設計時提供了更多的思路和捷徑。要想實現這個功能,內部類對象就必須有指向外部類對象的引用。 Java編譯器在創建內部類對象時,隱式的把其外部類對象的引用也傳了進去並一直保存著。這樣就使得內部類對象始終可以訪問其外部類對象,同時這也是為什麼在外部類作用範圍之外向要創建內部類對象必須先創建其外部類對象的原因。

    有人會問,如果內部類裡的一個成員變量與外部類的一個成員變量同名,也即外部類的同名成員變量被屏蔽了,怎麼辦?沒事,Java裡用如下格式表達外部類的引用:

    outerClass.this

    有了它,我們就不怕這種屏蔽的情況了。

    靜態內部類

    和普通的類一樣,內部類也可以有靜態的。不過和非靜態內部類相比,區別就在於靜態內部類沒有了指向外部的引用。這實際上和C++中的嵌套類很相像了,Java內部類與C++嵌套類最大的不同就在於是否有指向外部的引用這一點上,當然從設計的角度以及以它一些細節來講還有區別。

    除此之外,在任何非靜態內部類中,都不能有靜態數據,靜態方法或者又一個靜態內部類(內部類的嵌套可以不止一層)。不過靜態內部類中卻可以擁有這一切。這也算是兩者的第二個區別吧。

    局部內部類

    是的,Java內部類也可以是局部的,它可以定義在一個方法甚至一個代碼塊之內。

    public class Goods1 {

    public Destination dest(String s) {

    class GDestination implements Destination {

    private String label;

    private GDestination(String whereTo) {

    label = whereTo;

    }

    public String readLabel() { return label; }

    }

    return new GDestination(s);

    }

    public static void main(String[] args) {

    Goods1 g= new Goods1();

    Destination d = g.dest(“Beijing”);

    }

    }

    上面就是這樣一個例子。在方法dest中我們定義了一個內部類,最後由這個方法返回這個內部類的對象。如果我們在用一個內部類的時候僅需要創建它的一個對象並創給外部,就可以這樣做。當然,定義在方法中的內部類可以使設計多樣化,用途絕不僅僅在這一點。

    下面有一個更怪的例子:

    public class Goods2{

    private void internalTracking(boolean b) {

    if(b) {

    class TrackingSlip {

    private String id;

    TrackingSlip(String s) {

    id = s;

    }

    String getSlip() { return id; }

    }

    TrackingSlip ts = new TrackingSlip(“slip”);

    String s = ts.getSlip();

    }

    }

    public void track() { internalTracking(true); }

    public static void main(String[] args) {

    Goods2 g= new Goods2();

    g.track();

    }

    }

    你不能在if之外創建這個內部類的對象,因為這已經超出了它的作用域。不過在編譯的時候,內部類TrackingSlip和其他類一樣同時被編譯,只不過它由它自己的作用域,超出了這個範圍就無效,除此之外它和其他內部類並沒有區別。

    匿名內部類

    java的匿名內部類的語法規則看上去有些古怪,不過如同匿名數組一樣,當你只需要創建一個類的對象而且用不上它的名字時,使用內部類可以使代碼看上去簡潔清楚。它的語法規則是這樣的:

    new interfacename(){……};或new superclassname(){……};

    下面接著前面繼續舉例子:

    public class Goods3 {

    public Contents cont(){

    return new Contents(){

    private int i = 11;

    public int value() {

    return i;

    }

    };

    }

    }

    這裡方法cont()使用匿名內部類直接返回了一個實現了接口Contents的類的對象,看上去的確十分簡潔。

    在java的事件處理的匿名適配器中,匿名內部類被大量的使用。例如在想關閉窗口時加上這樣一句代碼:

    frame.addWindowListener(new WindowAdapter(){

    public void windowClosing(WindowEvent e){

    System.exit(0);

    }

    });

    有一點需要注意的是,匿名內部類由於沒有名字,所以它沒有構造函數(但是如果這個匿名內部類繼承了一個只含有帶參數構造函數的父類,創建它的時候必須帶上這些參數,並在實現的過程中使用super關鍵字調用相應的內容)。如果你想要初始化它的成員變量,有下面幾種方法:

    如果是在一個方法的匿名內部類,可以利用這個方法傳進你想要的參數,不過記住,這些參數必須被聲明為final。

    將匿名內部類改造成有名字的局部內部類,這樣它就可以擁有構造函數了。

    在這個匿名內部類中使用初始化代碼塊。

    為什麼需要內部類?

    java內部類有什麼好處?為什麼需要內部類?

    首先舉一個簡單的例子,如果你想實現一個接口,但是這個接口中的一個方法和你構想的這個類中的一個方法的名稱,參數相同,你應該怎麼辦?這時候,你可以建一個內部類實現這個接口。由於內部類對外部類的所有內容都是可訪問的,所以這樣做可以完成所有你直接實現這個接口的功能。

    不過你可能要質疑,更改一下方法的不就行了嗎?

    的確,以此作為設計內部類的理由,實在沒有說服力。

    真正的原因是這樣的,java中的內部類和接口加在一起,可以的解決常被C++程序員抱怨java中存在的一個問題??沒有多繼承。實際上,C++的多繼承設計起來很複雜,而java通過內部類加上接口,可以很好的實現多繼承的效果。

  • 新手入門:介紹Java學習的一些主線思路

    Java發展到現在,按應用來分主要分為三大塊:J2SE,J2ME和J2EE。

    這三塊相互補充,應用範圍不同。

    J2SE就是Java2的標準版,主要用於桌面應用軟件的編程;

    J2ME主要應用於嵌入是系統開發,如手機和PDA的編程;

    J2EE是Java2的企業版,主要用於分佈式的網絡程序的開發,如電子商務網站和ERP系統。

    先學習j2se

    要學習j2ee就要先學習j2se,剛開始學習j2se先建議不要使用IDE,然後漸漸的過渡到使用IDE開發,畢竟用它方便嘛。學習j2se推薦兩本書,《java2核心技術一二卷》,《java編程思想》,《java模式》。其中《java編程思想》要研讀,精讀。這一段時間是基本功學習,時間會很長,也可能很短,這要看學習者自身水平而定。

    不要被IDE糾纏

    在學習java和j2ee過程中,你會遇到五花八門的IDE,不要被他們迷惑,學JAVA的時候,要學語言本身的東西,不要太在意IDE的附加功能,JAVA編程在不同IDE之間的轉換是很容易的,過於的在意IDE的功能反而容易耽誤對語言本身的理解。目前流行的IDE有jbuilder,eclipse和eclipse的加強版WSAD。用好其中一個就可以了,推薦從eclipse入手j2ee。因為Jbuilder更適合於寫j2se程序。

    選擇和學習服務器使用配置

    當你有了j2se和IDE的經驗時,可以開始j2ee的學習了,web服務器:tomcat,勿庸置疑,tomcat為學習web服務首選。而應用服務器目前主要有三個:jboss、weblogic、websphere。有很多項目開始採用jboss,並且有大量的公司開始做websphere或weblogic向jboss應用服務器的移植(節省成本),這裡要說的是,學習tomcat和jboss我認為是首選,也是最容易上手的。學習服務器使用配置最好去詢問有經驗的人(有條件的話),因為他們或許一句話就能解決問題,你自己上網摸索可能要一兩天(我就乾過這種傻事),我們應該把主要時間放在學習原理和理論上,一項特定技術的使用永遠代替不了一個人的知識和學問。

    學習web知識

    如果你是在做電子商務網站等時,你可能要充當幾個角色,這是你還要學習:

    html,可能要用到dreamwave等IDE。

    Javascript,學會簡單的數據校驗,數據聯動顯示等等。

    J2eeAPI學習

    學習j2eeAPI和學習服務器應該是一個迭代的過程。

    先學習jsp和servlet編程,這方面的書很多,我建立看oreilly公司的兩本《jsp設計》和《java servlet編程》,oreilly出的書總是那本優秀,不得不佩服。

    學習jdbc數據庫編程,j2ee項目大多都是MIS系統,訪問數據庫是核心。這本應屬於j2se學習中,這裡拿出來強調一下。

    學習jndi api,它和學習ejb可以結合起來。

    學習ejb api,推薦書《精通ejb》

    經過上面的這些的學習,大概可以對付一般的應用了。

    有人說跟著sun公司的《j2ee tutorial》一路學下來,當然也可以。

    學習ejb設計模式和看代碼(最重要)

    設計模式是練內功,其重要性可以這麼說吧,如果你不會用設計模式的話,你將寫出一堆使用了ejb的垃圾,有慢又是一堆bug,其結果不如不用ejb實現( ejb不等於j2ee)

    無論學習什麼語言,都應該看大量代碼,你看的代碼量不到一定數量,是學不好j2ee的。

    目前有很多開源的工程可以作為教材:

    jive論壇

    petstore sun公司

    dune sun公司

    等等,研讀一個,並把它用到自己的工程中來。

    J2ee其他學習

    當你漸漸對j2ee了解到一定深度時,你要開始關注當前領域中的一些技術變化,J2ee是一塊百家爭鳴的領域,大家都在這裡提出自己的解決方案,例如structs,hiberate,ofbiz等等,學習這些東西要你的項目和目標而定,預先補充一下未嘗不可,但不用涉及太深,畢竟學習原理和理論是最最重要的事。

    目前常見j2eeAPI

    JavaServer Pages(JSP)技術1.2

    Java Servlet技術2.3

    JDBC API 2.0

    Java XML處理API(JAXP)1.1

    Enterprise JavaBeans技術2.0

    Java消息服務(JMS)1.0

    Java命名目錄接口(JNDI)1.2

    Java事務API(JTA) 1.0

    JavaMail API 1.2

    JavaBeans激活架構(JAF)1.0

    J2EE連接器體系結構(JCA)1.0

    Java認證和授權服務(JAAS)1.0

    學習上面的某些API要以你的項目而定,了解所有他們總之是有好處的。

    上面印證了大家說的一句話,java語言本身不難學,但是技術太多,所以學java很費勁。回想一下,基本上每個初學者,在剛學習java的時候可能都會問別人這麼一句話,你怎麼知道的哪個方法(api)在哪個包裡的?呵呵,無他,唯手熟爾。

    1基礎是王道。我們的基礎要紮實紮實再紮實。

    以上面的整個流程來看java的技術分支很多,要想完全掌握是絕對不可能的。我們只有從中精通1到2個部分。但是java也是有通性的,所謂萬變不離其宗。 java的所有編程思路都是“面向對象”的編程。所以大家在往更高境界發展以前一定要打好基礎,這樣不管以後是jree還是j3d都有應刃而解的感覺。在這裡強烈推薦“java編程思想”.

    2所謂打好基礎並不是說要熟悉所有的java代碼。我說的意思是要了解java的結構。 class,methode,object,各種套用import,extend讓自己在結構上對java有個立體而且整體的了解即刻。其實java的學習不用固執於對代碼的熟悉,1來java本身帶有很多demo,java2d的所有問題幾乎都有demo的樣例。 2來java是開放代碼,即使沒有demo網絡上也有很多高手把自己的代碼分享。所以不要怕沒有參考,參考是到處都有的。

    3最後還有1點經驗和大家分享,對sun的api一定要學會活用,不論是學習還是作為參考api都有很大的幫助,在完全了解java的結構的基礎上,不論什麼方法都是可以通過api來找到的.所以不要怕找不到方法,了解結構,了解api就能找到方法。

  • linux文件系統基礎知識

    這兩天看了一本fedora 6的實踐教程,下面是有關linux文件系統知識的學習筆記:
    1、linux文件系統分配策略:
        塊分配( block allocation )和擴展分配( extent allocation )
        塊分配:磁盤上的文件塊根據需要分配給文件,避免了存儲空間的浪費。但當文件擴充時,會造成文件中文件塊的不連續,從而導致過多的磁盤尋道時間。
                每一次文件擴展時,塊分配算法就需要寫入文件塊的結構信息,也就是meta-dada 。 meta-data總是與文件一起寫入存儲設備,改變文件的操作要等到所有meta-data的操作都完成後才能進行,
                因此,meta-data的操作會明顯降低整個文件系統的性能。
        擴展分配:文件創建時,一次性分配一連串連續的塊,當文件擴展時,也一次分配很多塊。 meta-data在文件創建時寫入,當文件大小沒有超過所有已分配文件塊大小時,就不用寫入meta-data,直到需要再分配文件塊的時候。
                    擴展分配採用成組分配塊的方式,減少了SCSI設備寫數據的時間,在讀取順序文件時具有良好的性能,但隨機讀取文件時,就和塊分配類似了。
                    文件塊的組或塊簇( block cluster)的大小是在編譯時確定的。簇的大小對文件系統的性能有很大的影響。
        注: meta-data元信息:和文件有關的信息,比如權限、所有者以及創建、訪問或更改時間等。
    2、文件的記錄形式
         linux文家系統使用索引節點(inode)來記錄文件信息。索引節點是一種數據結構,它包含了一個文件的長度、創建及修改時間、權限、所屬關係、磁盤中的位置等信息。
    一個文件系統維護了一個索引節點的數組,每個文件或目錄都與索引節點數組中的唯一的元素對應。每個索引節點在數組中的索引號,稱為索引節點號。
         linux文件系統將文件索引節點號和文件名同時保存在目錄中,所以,目錄只是將文件的名稱和它的索引節點號結合在一起的一張表,目錄中每一對文件名稱和索引節點號稱為一個連接。
    對於一個文件來說,有一個索引節點號與之對應;而對於一個索引節點號,卻可以對應多個文件名。
        連接分為軟連接和硬連接,其中軟連接又叫符號連接。
        硬連接:原文件名和連接文件名都指向相同的物理地址。目錄不能有硬連接;硬連接不能跨文件系統(不能跨越不同的分區),文件在磁盤中只有一個拷貝。
                由於刪除文件要在同一個索引節點屬於唯一的連接時才能成功,因此硬連接可以防止不必要的誤刪除。
        軟連接:用ln -s命令建立文件的符號連接。符號連接是linux特殊文件的一種,作為一個文件,它的數據是它所連接的文件的路徑名。沒有防止誤刪除的功能。
    3、文件系統類型:
        
         ext2 :早期linux中常用的文件系統
         ext3 : ext2的升級版,帶日誌功能
         RAMFS :內存文件系統,速度很快
         NFS :網絡文件系統,由SUN發明,主要用於遠程文件共享
         MS-DOS : MS-DOS文件系統
         VFAT : Windows 95/98操作系統採用的文件系統
         FAT : Windows XP操作系統採用的文件系統
         NTFS : Windows NT/XP操作系統採用的文件系統
         HPFS : OS/2操作系統採用的文件系統
         PROC :虛擬的進程文件系統
         ISO9660 :大部分光盤所採用的文件系統
         ufsSun : OS所採用的文件系統
         NCPFS : Novell服務器所採用的文件系統
         SMBFS : Samba的共享文件系統
         XFS :由SGI開發的先進的日誌文件系統,支持超大容量文件
         JFS :IBM的AIX使用的日誌文件系統
         ReiserFS :基於平衡樹結構的文件系統
         udf:可擦寫的數據光盤文件系統
    4、虛擬文件系統VFS
        
         linux支持的所有文件系統稱為邏輯文件系統,而linux在傳統的邏輯文件系統的基礎上增加料一個蓄念文件系統( Vitual File System ,VFS)的接口層。
        虛擬文件系統(VFS)位於文件系統的最上層,管理各種邏輯文件系統,並可以屏蔽各種邏輯文件系統之間的差異,提供統一文件和設備的訪問接口。
    5、文件的邏輯結構
        文件的邏輯結構可分為兩大類:字節流式的無結構文件和記錄式的有結構文件。
        由字節流(字節序列)組成的文件是一種無結構文件或流式文件,不考慮文件內部的邏輯結構,只是簡單地看作是一系列字節的序列,便於在文件的任意位置添加內容。
        由記錄組成的文件稱為記錄式文件,記錄是這種文件類型的基本信息單位,記錄式文件通用於信息管理。
    6、文件類型
        
        普通文件:通常是流式文件
        目錄文件:用於表示和管理系統中的全部文件
        連接文件:用於不同目錄下文件的共享
        設備文件:包括塊設備文件和字符設備文件,塊設備文件表示磁盤文件、光盤等,字符設備文件按照字符操作終端、鍵盤等設備。
        管道(FIFO)文件:提供進程建通信的一種方式
        套接字(socket)文件:該文件類型與網絡通信有關
    7、文件結構:包括索引節點和數據
        索引節點:又稱I節點,在文件系統結構中,包含有關相應文件的信息的一個記錄,這些信息包括文件權限、文件名、文件大小、存放位置、建立日期等。文件系統中所有文件的索引節點保存在索引節點表中。
        數據:文件的實際內容。可以是空的,也可以非常大,並且擁有自己的結構。
    8、ext2文件系統
        
         ext2文件系統的數據塊大小一般為1024B、2048B或4096B
         ext2文件系統採用的索引節點(inode):
            索引節點採用了多重索引結構,主要體現在直接指針和3個間接指針。直接指針包含12個直接指針塊,它們直接指向包含文件數據的數據塊,緊接在後面的3個間接指針是為了適應文件的大小變化而設計的。
         eg:假設數據塊大小為1024B ,利用12個直接指針,可以保存最大為12KB的文件,當文件超過12KB時,則要利用單級間接指針,該指針指向的數據塊保存有一組數據塊指針,這些指針依次指向包含有實際數據的數據塊,
            假如每個指針佔用4B,則每個單級指針數據塊可保存1024/4=256個數據指針,因此利用直接指針和單級間接指針可保存1024*12+1024*256=268 KB的文件。當文件超過268KB時,再利用二級間接指針,直到使用三級間接指針。
            利用直接指針、單級間接指針、二級間接指針、三級間接指針可保存的最大文件大小為:
                 1024*12+1024*256+1024*256*256+1024*256*256*256=16843020 KB,約16GB
            若數據塊大小為2048B,指針佔4B,則最大文件大小為: 2048*12+2048*512+2048*512*512+2048*512*512*512=268,960,792 KB約268GB
            若數據塊大小為4096B,指針佔4B,則最大文件大小為: 4096*12+4096*1024+4096*1024*1024+4096*1024*1024*1024=4,299,165,744 KB ,約4TB
        注:命令tune2fs -l /dev/sda5可查看文件系統
         ext2文件系統最大文件名長度: 255個字符
        
         ext2文件系統的缺點:
                 ext2在寫入文件內容的同時並沒有同時寫入文件meta-data,其工作順序是先寫入文件的內容,然後等空閒時候才寫入文件的meta-data。若發生意外,則文件系統就會處於不一致狀態。
            在重新啟動系統的時候,linux會啟動fsk ( file system check)的程序,掃描整個文件系統並試圖修復,但不提供保證。
    9、ext3文件系統:
        
         ext3基於ext2的代碼,所以磁盤格式與ext2相同,使用相同的元數據。
         ext2文件系統無損轉化為ext3文件系統: tune2fs -j /dev/sda6
        
        日誌塊設備( Journaling block device layer,JBD)完成ext3文件系統日誌功能。 JBD不是ext3文件系統所特有的,它的設計目標是為了向一個塊設備添加日誌功能。
        當一個文件修改執行時,ext3文件系統代碼將通知JBD,稱為一個事務(transaction)。發生意外時,日誌功能具有的重放功能,能重新執行中斷的事務。
        
        日誌中的3種數據模式:
             1)、data=writeback :不處理任何形式的日誌數據,給用戶整體上的最高性能
             2)、data=odered :只記錄元數據日誌,但將元數據和數據組成一個單元稱為事務(transaction) 。此模式保持所句句的可靠性與文件系統的一致性,性能遠低於data=writeback模式,但比data=journal模式快
             3)、data=journal :提供完整的數據及元數據日誌,所有新數據首先被寫入日誌,然後才被定位。意外發生過後,日誌可以被重放,將數據與元數據帶回一致狀態。這種模式整體性能最慢,但數據需要從磁盤讀取和寫入磁盤時卻是3種模式中最快的。
         ext3文件系統最大文件名長度: 255個字符
         ext3文件系統的優點:可用性、數據完整性、速度、兼容性
    10、ReiserFS文件系統
        
         ReiserFS文件系統是由Hans Reiser和他領導的開發小組共同開發的,整個文件系統完全是從頭設計的,是一個非常優秀的文件系統。也是最早用於Linux的日誌文件系統之一。
         ReiserFS的特點
        先進的日誌機制
             ReiserFS有先進的日誌(Journaling/logging)功能機制。日誌機制保證了在每個實際數據修改之前,相應的日誌已經寫入硬盤。文件與數據的安全性有了很大提高。
        高效的磁盤空間利用
             Reiserfs對一些小文件不分配inode。而是將這些文件打包,存放在同一個磁盤分塊中。而其它文件系統則為每個小文件分別放置到一個磁盤分塊中。
        獨特的搜尋方式
             ReiserFS基於快速平衡樹(balanced tree)搜索,平衡樹在性能上非常卓越,這是一種非常高效的算法。 ReiserFS搜索大量文件時,搜索速度要比ext2快得多。 Reiserfs文件系統使用B*Tree存儲文件,而其它文件系統使用B+Tree樹。 B*Tree查詢速度比B+Tree要快很多。 Reiserfs在文件定位上速度非常快。
            在實際運用中,ReiserFS在處理小於4k的文件時,比ext2快5倍;帶尾文件壓縮功能(默認)的ReiserFS比ext2文件系統多存儲6%的數據。
        支持海量磁盤
             ReiserFS是一個非常優秀的文件系統,一直被用在高端UNIX系統上,可輕鬆管理上百G的文件系統,ReiserFS文件系統最大支持的文件系統尺寸為16TB。這非常適合企業級應用中。
        優異的性能
            由於它的高效存儲和快速小文件I/O特點,使用ReiserFs文件系統的PC,在啟動X窗口系統時,所花的時間要比在同一台機器上使用ext2文件系統少1/3。另外,ReiserFS文件系統支持單個文件尺寸為4G的文件,這為大型數據庫系統在linux上的應用提供了更好的選擇。

  • Linux系統新手學習的11點建議

    隨著Linux應用的擴展許多朋友開始接觸Linux,根據學習Windwos的經驗往往有一些茫然的感覺:不知從何處開始學起。這裡介紹學習Linux的

    一些建議。

    一、從基礎開始:常常有些朋友在Linux論壇問一些問題,不過,其中大多數的問題都是很基礎的。例如:為什麼我使用一個命令的時候,系

    統告訴我找不到該目錄,我要如何限制使用者的權限等問題,這些問題其實都不是很難的,只要了解了Linux的基礎之後,應該就可以很輕

    易的解決掉這方面的問題。而有些朋友們常常一接觸Linux就是希望構架網站,根本沒有想到要先了解一下Linux的基礎。這是相當困難的。
    二、Linux命令是必須學習雖然Linux桌面應用發展很快,但是命令在Linux中依然有很強的生命力。 Linux是一個命令行組成的操作系統,精髓

    在命令行,無論圖形界面發展到什麼水平這個原理是不會變的,Linux命令有許多強大的功能:從簡單的磁盤操作、文件存取、到進行複雜的

    多媒體圖像和流媒體文件的製作。

    舉一個例子: Linux的常用命令find,察看man文檔,初學者一定會覺得太複雜而不原意用,但是你一旦學會就愛不釋手.它的功能實在太強了,在

    配合exec參數或者通過管道重定向到xargs命令和grep命令,可以完成非常複雜的操作,如果同樣的操作用圖形界面的工具來完成,恐怕要多花十

    幾陪的時間.不同版本的Linux命令數量不一樣,這裡筆者把它們中比較重要的和使用頻率最多的命令,按照它們在系統中的作用分成幾個部

    分介紹給大家,通過這些基礎命令的學習我們可以進一步理解Linux系統:安裝和登錄命令:login、 shutdown、 halt、 reboot 、mount、

    umount 、chsh文件處理命令:file、 mkdir、 grep、dd、 find、 mv 、ls 、diff、 cat、 ln系統管理相關命令: df、 top、 free、

    quota 、at、 lp、 adduser、 groupadd kill、 crontab、 tar、 unzip、 gunzip 、last網絡操作命令:ifconfig、 ip 、ping 、

    netstat 、telnet、 ftp、 route、 rlogin rcp 、finger 、mail 、nslookup系統安全相關命令: passwd 、su、 umask 、chgrp、

    chmod、chown、chattr、sudo、 pswho

    三、選擇一本好的工具書工具書對於學習者而言是相當重要的。一本錯誤觀念的工具書卻會讓新手整個誤入歧途。目前國內關於Linux的書籍

    有很多不過精品的不多,筆者強烈建議閱讀影印本的“O’Reilly原版Linux圖書http://www.oreilly.com.cn/ ”,而且出版社還提供了一個非

    常好的路線圖:http://www.oreilly.com.cn/guide/guide_linux.php

    四、選擇一個適合你的Linux發行版本目前全球有超過1百多個Linux發行版本,在國內也能找到十幾個常見版本。如何選擇請根據你的需求和

    能力,Redhat Linux和Debian Linux是網絡管理員的理想選擇。對於英語不是很好的讀者紅旗Linux、中標Linux這些中文版本比較適合。現

    在一些Linux網站有一些Linux版本的免費下載,這裡要說的是並不適合Linux初學者。

    五、養成在命令行下工作:一定要養成在命令行下工作的習慣,要知道X-window只是運行在命令行模式下的一個應用程序。在命令行下學習

    雖然一開始進度較慢,但是熟悉後,您未來的學習之路將是以指數增加的方式增長的。從網管員來說,命令行實際上就是規則,它總是有效的

    ,同時也是靈活的。即使是通過一條緩慢的調製解調器線路,它也能操縱幾千公里以外地遠程系統。

    六、選擇一個適合你的Linux社區;隨著Linux應用的擴展,出現了不少Linux社區。其中有一些非常優秀的社區:www.linuxforum.net(國內

    最高水平GNU站點)、 http://www.chinaunix.net/ (中國最大的Unix技術社區),但是這幾個論壇往往是Linux高手的舞台,如果在探討高

    級技巧的論壇張貼非常初級的問題經常會沒有結果。還有一些非常豐富的學習資料及社區的綜合站點,如:www.xxlinux.com學習文章和資料非

    常的充足,也有社區供大家交流.初學這可以得到很大的幫助.

    七、勤於實踐:要增加自己Linux的技能,只有通過實踐來實現了。所以,趕快找一部計算機,趕快安裝一個Linux發行版本,然後進入精

    彩的Linux世界。相信對於你自己的Linux能力必然大有斬獲。此外,人腦不像計算機的硬盤一樣,除非硬盤壞掉了或者是資料被你抹掉了,

    否則儲存的資料將永遠而且立刻的記憶在硬盤中。在人類記憶的曲線中,你必須要不斷的重複練習才會將一件事情記得比較熟。同樣的,學習

    Linux也一樣,如果你無法經常學習的話,學了後面的,前面的忘了。你對Linux命令熟悉後你可以開始搭建一個小的Linux網絡,這是最好的

    實踐方法。 Linux是網絡的代名詞,Linux網絡服務功能非常強大,不論是郵件服務器、Web服務器、DNS服務器等都非常完善。當然你不需搭

    建所有服務,可以慢慢來。需要說明的是這個Linux網絡對於初學者有兩三台計算機即可,其中一台計算機最好安裝Windows系統。自己多動手

    ,不要非要等著別人幫你解決問題。

    八、如何得到聯機幫助和私有操作系統不同,各個Linux的發行版本的技術支持時間都較短,這對於Linux初學者是往往不夠的。其實當你安

    裝了一個完整的Linux系統後其中已經包含了一個強大的幫助,只是可能你還沒有發現和使用它們的技巧。
    1.主流Linux發行版都自帶非常詳細的文檔(包括手冊頁和FAQ),從系統安裝到系統安全,針對不同層次的人的詳盡文檔,仔細閱讀文檔後

    40%問題都可在此解決。

    2.查閱經典工具書和Howto,特別是Howto是全球數以萬計的Linux、Unix的經驗總結非常有參考價值通常40%的問題同樣可以解決。
    九、在Linux論壇獲取幫助如果上面的措施沒有解決問題,此時你就需要Linux社區的幫助了。 Linux的使用者一般都是專業人士,他們有著很

    好的電腦背景且願意協助他人, Linux高手更具有鼓勵新手的文化精神。如何在Linux社區獲得幫助,需要說明的是你要有周全的思考,準備

    好你的問題,不要草率的發問,否則只會得到到草率的回答或者根本得不到任何答案。越表現出在尋求幫助前為解決問題付出的努力,你越能

    得到實質性的幫助。最好先搜尋一下論壇是否有您需要的文章。這樣可以獲得事半功倍的效果。下面筆者在論壇看到的一個好問題:“安裝

    紅旗4.0後,系統紫光輸入法自帶的雙拼方案和我的習慣不一樣,如何自定義雙拼方案解決?謝謝? ”這個問題很簡練,筆者五分鐘後就給出

    了解決方法:“首先備份原文件到其他目錄,然後刪掉/usr/local/unispim/unispimsp.ksc,編輯/usr/local/unispim/unispimsp.ini ,最

    後重啟動計算機,生成新的unispimsp.ksc”另外得到回復後如果問題解決,向幫助過你的人發個說明,讓他們知道問題是怎樣解決的,這種

    補充有助於他人在郵件列表/新聞組/論壇中搜索對你有過幫助的完整解決方案,這可能對他們也很有用。下面看看一個讓人無法回答的問題:

    “救命各位高手,向你們請教一些問題:如何在Linux下配製HTTP、FTP、Samba、DNS、DHCP、 Sendmail服務器,謝謝”這樣的問題我想即使

    Linux高手也很難快速準確精練的回答你。你需要提供精確有效的信息。這並不是要求你簡單的把成噸的出錯代碼或者數據完全轉儲摘錄到你

    的提問中。如果你有龐大而復雜的測試條件,盡量把它剪裁得越小越好。可能你會遇到這種情況,對於一個問題會出現不同內容回答,這時你

    需要通過實踐來驗證。另外把這個問題放在其他Linux社區請求幫助也是一種選擇。如果得不到答案,請不要以為我們覺得無法幫助你。有時

    只是看到你問題的人不知道答案罷了。這時換一個社區是不錯的選擇。另外發問的時候一定要注意到某些禮節。因為Linux社區是一個鬆散的

    組織、也不承擔回复每個帖子的義務。它不是技術支持。

    十.用Unix思維學習Linux Linux是參照Unix思想設計的,理解掌握Linux必須按照Unix思維來進行。思想性的轉變比暫時性的技術提高更有用

    ,因為他能幫助你加快學習速度。

    十一.學習專業英文如果你想深入學習Linux,看不懂因為文檔實在是太難了。寫的最好的,最全面的文檔都是英語寫的,最先發布的技術信息也

    都是用英語寫的。即便是非英語國家的人發布技術文檔,也都首先翻譯成英語在國際學術雜誌和網絡上發表。安裝一個新的軟件時先看README,

    再看INSTALL然後看FAQ,最後才動手安裝,這樣遇到問題就知道為什麼。如果說明文檔不看,結果出了問題再去論壇來找答案反而浪費時間。 11

    .最後是Linux學習的路線圖:

    1.掌握至少50個以上的常用命令。
    2.熟悉Gnome/KDE等X-windows桌面環境操作。
    3.掌握.tgz、.rpm等軟件包的常用安裝方法
    4.學習添加外設,安裝設備驅動程序(比如網卡)
    5.熟悉Grub/Lilo引導器及簡單的修復操作。
    6.熟悉Linux文件系統和目錄結構。
    7.掌握vi,gcc,gdb等常用編輯器,編譯器,調試器。
    8.理解shell別名、管道、I/O重定向、輸入和輸出以及shell腳本編程。
    9.學習Linux環境下的組網。
        以上是筆者學習Linux一些經驗,希望對你有些幫助。

  • Google 的 Chrome OS 能否战胜 Windows

    人们都在谈论Google的Chrome OS能否击败Windows,但这是个问题吗?Chrome OS就根本不是一个新的操作系统,或者说他跟Windows比起来还称不上一个完整的操作系统。

    就像Google自己说的那样,Chrome OS依附于Linux操作系统,只是为其加了一层新的窗口系统,和Google自己的浏览器而已。

    更geek点的说,它只是一个“外壳”,而不是操作系统。核心层,和大量的userland程序才是建立起操作系统的关键。

    程序员和科技学者Dave Winer说到:

    同学们,我们要冷静呀,冷静!Google的新闻稿怎么说的?第一,Chrome OS运行于Linux;第二,Linux才是操作系统。第三:是Linux运行于上网本。无论如何,大多数人还是希望在上网本运行Windows XP,而非Linux。这才是真相之所在。

    也许Google会逐渐开发他们自己的革命性操作系统,它或者会像Google Base和Google Notepad那样落得失败的命运,也许会像Android系统那样运行于上网本,就像现在的Chrome OS将希望都寄托于上网本那样。

    不管怎么样,至少Chrome OS的新闻稿让一小撮用户兴奋起来并达到高潮,Google的目的达到了!