2013年4月3日 星期三

關閉/啟用 IPv6 臨時位址 (temporary address, privacy extensions)


Windows Vista/7/8/Server 2008:
netsh interface ipv6 set privacy state=disabled store=active
netsh interface ipv6 set privacy state=disabled store=persistent
輸入之後,馬上生效,不需重開機。如果需要啟動,則只要將上述指令中的 disabled 改為 enabled 即可。


IPv6 環境已經沒有 NAT 這回事了(至少目前是這樣),使用 global IPv6 位址連上 internet 之後,就可以與其他人互通。
一般來說 IPv6 位址 (128 bits) 由 Prefix 和 Interface ID 所組成。 Prefix 可視為網路編號,因此除非網路改號,否則是不變的。而 Interface ID 一般是用 EUI-64 的方法,參照 MAC 位址來產生的,所以只要是利用同一張網路卡,其 Interface ID 也就不會變。
因此,雖然 IPv6 在 internet 直接互連可以增加效率、非常便利,但一直使用相同的位址,很容易被壞人盯上。所以 RFC 4941 定義了 IPv6 Privacy Extension,讓 IPv6 host 可以隨機產生 Interface ID,定期更換,以提高安全性。這樣的位址又有人稱為臨時位址 (temporary address)。
因此,雖然 RFC 裡面建議預設不要啟動,但常用的作業系統 (Windows, Mac, Linux) 都會優先使用臨時位址連線。


2013年3月21日 星期四

[轉] 寬頻網絡部署IPv6探討


  雖然IETF的IPv6工作開始於1990年,但截至目前為止IPv6還是很少被用於個人業務上。雖然各國政府/機構一直在推動采用服務提供商部署IPv6,但是沒有真正的商業上的驅動力,一方面沒有新的應用需要IPv6,另一方面普遍認為IPv6的引入成本太高。上述原因導致了服務提供商很少關註在住宅寬帶網絡中引入IPv6。但是,隨著公網IPv4地址的枯竭,智能手機和M2M設備的迅速普及,越來越多的人認識到需要通過引入IPv6來維持業務增長並為客戶提供完善的服務。
  從技術角度看IPv6與IPv4是不兼容的,並且IPv6中的一些新概念會改變寬帶網絡的運作模式:
  IPv6的尋址方式:單播:LLA(鏈路本地地址),GUA(全球單播地址)和ULA(本地唯一地址),組播尋址,廣播尋址的取消
  IPv6報頭的變化:例如下一個報頭,等
  SLAAC:無狀態地址自動配置,不需要使用DHCPServer
  缺省路由器支持使用路由器通告(RA)
  DHCPPD:通過DHCP的前綴委派為家庭網絡分配前綴地址
  鄰居發現(ND),MLD(組播偵聽發現)等通過ICMP支持
  盡管這些改變都有很好的理由,但是這些概念會影響IPv6如何在住宅用戶網絡部署,網絡中各個網元對IPv6的支持程度也不盡相同。
  2終端設備硬件/操作系統
  PC:MACOS,Linux,WindowsVista/Windows 7具有良好的IPv6支持,而Windows XP可工作在雙棧模式,Windows 98不支持IPv6
  手機終端對IPv6的支持剛剛開始(Symbian,iPhone,Android等)
  VoIP系統對IPv6的支持較較差
  IPTV系統/機頂盒對IPv6的支持較差
  CPE/家庭網關
  在新的xDSL/GPON/以太網設備上開始支持IPv6
  接入節點
  DSL/GPON/以太網設備:大多數廠商開始支持IPv6。
  匯聚/邊緣/核心網絡設備
  大多數設備很早就開始支持IPv6,有些已經部署了一段時間。
  固定移動業務邊緣節點(BNG/ BRAS,媒體網關GGSN/ PGW)
  BNG/BRAS:大多數廠商支持基於IPv6的PPPoX,IPoE(DHCPv6/ DHCPv6 PD)和LNS
  GGSN/PGW:大多數廠商都支持3GPPR8和R7的IPv6架構
  應用
  最終用戶應用程序:是否能在合適的操作系統上運行,是否能夠運行IPv6API從而支持IPv6網絡連接
  網站:是否支持IPv6尋址和連接
  CDN:是否支持IPv6尋址和連接
  上述因素對引入IPv6的影響取決於運營商所選擇的網絡設計。接下來會具體分析在在固定/移動網絡中的引入IPv6的場景,因為大多數組播IPTV平臺還沒有準備好向IPv6遷移而大多數IPTV方案不需要使用公網IPv4地址,所以分析將集中在建立單播IPv6連接上。
  PPPoE網絡中引入IPv6
  在使用PPPoE的電信網絡環境中如何支持IPv6在寬帶論壇的TR–187中有明確定義。在PPPoE/L2TP網絡中引入IPv6不會對接入和匯聚網元產生任何影響。IPv6PPP會話認證方式與IPv4一樣使用PAP/CHAP或option82,並且IPv4和IPv6會話的認證可以在同一個認證階段同時進行。由於PPPoXIPv6CP只定義鏈路本地地址,全球IPv6地址通常由DHCP或SLAAC分配。在使用IPv6路由型家庭網關的情況下,在家庭網關和BNG/BRAS之間需要下列機制確保IPv6連接。
  PPPoEIPv6CP用於鏈路本地地址分配(LLA)
  DHCPv6的前綴委派(IA- PD)用於獲取局域網地址前綴
  無狀態DHCPv6用於獲取其他配置參數
  當部署numberedRG模型時,有狀態的DHCPv6(IA-NA)用於獲取家庭網關的IPv6地址。而部署unnumbered RG模型時,則不是必需的
  使用路由器通告分配默認網關
  采用路由型家庭網關PPP模型時,建立IPv6連接的典型流程如下圖所示:
圖1IPv6PPPoE接入– 路由型RG:DHCPv6 PD
圖1IPv6PPPoE接入– 路由型RG:DHCPv6 PD
  另一種用於提供IPv6PPPoE連接的方法是使用橋接型家庭網關,也稱為主機模型。為確保在這個模型下的IPv6連接,在終端設備(通常是個人電腦)和BNG/BRAS之間需要執行下列機制。
  PPPoEIPv6CP用於鏈路本地地址分配(LLA)
  SLAAC用於為主機獲得全球單播IPv6地址
  無狀態DHCP用於獲取其他的配置參數
  使用路由器通告分配默認網關
  采用橋接型家庭網關PPP模型時,建立IPv6連接的典型流程如下圖所示:
  
圖1IPv6PPPoE接入– 路由型RG:DHCPv6 PD
圖2IPv6PPPoE接入– 橋接型RG:SLAAC
  提供PPPoE業務時,使用N:1VLAN或1:1VLAN的結構對於部署IPv6還是IPv4沒有區別。在采用PPPoE的寬帶網絡中引入IPv6只對BNG和CPE/RG產生影響,對CPE/RG具體影響取決於家庭網絡使用橋接模式還是路由模式。采用RADIUS進行認證/計費/COA時,還需要RADIUS支持一些新的屬性。
  IPoE網絡中引入IPv6
  在電信網絡中支持IPv6IPoE在寬帶論壇中的TR–177中有詳細定義。引入IPv6IPoE對網絡的影響主要取決於部署的VLAN模型是1:1模型還是N:1模型,以及家庭網絡選擇橋接型還是路由型部署模式。
  當采用1:1VLAN模型時,可以從VLANID判斷家庭身份。因此引入IPv6時,只要現有的設備支持基本的IPv6轉發機制,無論是接入網絡還是匯聚網絡都不需要有任何變化。而采用N:1VLAN模型時,接入節點至少要支持LDRA(輕量級的DHCPv6中繼代理),以確保BNG/BRAS知道收到的DHCP請求是從哪個用戶發出的。同時,接入節點最好能夠支持anti-spoofing。
  使用IPv6路由型家庭網關部署DHCPv6,在家庭網關和BNG/BRAS之間需要執行下列機制以確保IPv6連接。
  DHCPv6的前綴委派(IA-PD):為家庭網關分配唯一的IPv6前綴在家庭網絡中使用。
  如果使用numberedRG模型,為家庭網關分配DHCPv6廣域網地址
  從BNG收到有效路由器通告後,設定BNG鏈路本地地址作為下一跳缺省路由
  采用路由型家庭網關IPoE模型時,建立IPv6連接的典型流程如下圖所示:
圖1IPv6PPPoE接入– 路由型RG:DHCPv6 PD
圖3IPv6IPoE接入(xDSL/FTTx接入)-路由型RG:DHCPv6 PD
  當部署橋接家庭網關模型來支持IPv6IPoE時,對網絡的影響取決於是采用DHCP還是SLAAC為終端設備分配地址。采用DHCP時,橋接型家庭網關IPoE模型與路由型家庭網關IPoE模型的主要區別是只對主機分配一個IA地址而不需要DHCPPD地址。值得關註的是要確保家庭網絡中的IPv6設備之間的通信在本地完成的,不通過BNG。
  而采用SLAAC則會帶來一系列新的問題。在N:1的VLAN部署模型中,BNG不知道路由器請求消息是從哪個用戶發來的,因此BNG不知道在路由器通告消息發送哪個前綴。為了解決這個問題,接入節點需要在路由器請求消息中增加一個線路標識選項,就像對DHCPv6所做的一樣。與此同時,BNG/BRAS需要確保對應的路由器通告消息可以被接入節點轉發到正確的用戶處。
  由於接入網絡的split-horizon的轉發行為,重復地址檢測(DAD)消息不會被送給鄰近的用戶,BNG需要支持DAD代理功能幫助確保DAD功能正常工作。因為這些問題仍在IETF討論,因此目前很少有BNG/接入設備支持這種場景。
  移動網絡中引入IPv6
  移動網絡中的IPv6連接場景在3GPPR7/R8等規範中定義得很清楚。建立IPv6連接所涉及的主要網元是UE和GGSN/PGW。
  在移動網絡中提供IPv6連接,在UE和GGSN/PGW之間需要運行下列機制:
  SLAAC(路由器請求/路由器通告)使用/64地址提供IPv6連接
  在創建的PDP響應中的PCO選項中提供DNS信息
  從GGSN/PGW收到有效路由器通告後,設定GGSN/PGW的鏈路本地地址作為下一跳缺省路由
  3GPP從R8開始定義了一種機制,在單一的PDP/BearerContext上使用PDPtype(IPv4IPv6)同時分配IPv4和IPv6地址。有了這一機制,引入IPv6時不需要額外創建PDP Context。然而,在R8之前,每種PDN類型(IPv4和IPv6)都需要一個PDP Context,這會降低GGSN的可擴展性。
  
圖1IPv6PPPoE接入– 路由型RG:DHCPv6 PD
圖4移動網絡引入IPv6
  在解決IPv4公網地址耗盡的問題和逐步引入IPv6的過程中有很多可能性,也會有很多部署的實際問題,阿爾卡特朗訊一直使用ISOCORE第三方獨立實驗室驗證在各種IPv6部署場景下的部署細節。阿爾卡特朗訊將會通過細致的技術驗證工作幫助固定和移動運營商在從IPv4向IPv6遷移的過程中做出正確的選擇,並從技術和業務上解決多種緯度的問題。

2013年3月20日 星期三

APIPA(Automatic Private IP Addressing)

APIPA 是 Windows 作業系統所具有的一種特性。對於公司企業的網路環境,一般而言都會有 DHCP(Dynamic Host Configuration Protocol) 伺服器來支援用戶端電腦 IP 位址、子網路遮罩(subnet mask) 與相關DHCP選項的自動設定。但是對不具有 DHCP 伺服器的網路環境而言,如果用戶端電腦一開機找不到 DHCP 伺服器,就會自動啟動 APIPA 機制,將自己的 IP 位址設定為 169.254.0.1 到 169.254.255.254 的範圍,而子網路遮罩則是 255.255.0.0。之後用戶端的 APIPA服務會持續每5分鐘一次,週期的檢查 DHCP 伺服器是否出現,如果偵測到 DHCP 伺服器,APIPA 便會停止,原先的IP 相關設定轉為向 DHCP 伺服器要求。

由於 APIPA 是自我指定 IP 位址,因此就有可能產生相同 IP 位址的問題,要避免 IP 衝突的問題,APIPA 用戶端會送出 gratuitous ARP(Address Resolution Protocol)封包,以便宣告我要使用某個 169.254.x.x的 IP 位址,若有其他 APIPA用戶端剛好要用到同樣 IP 位址時,先前佔用此 IP 的用戶便會告訴後者這個 IP 位址已被採用,後者就只好重新配一個 IP 位置,若配到的 IP 位址也被用掉了,就再重覆配置的動作,總共有十次的配置的機會。

APIPA 對於小型不作路由的網路環境很實用,不需作任何設定,電腦之間就能透過網路連線,而且從 Windows 98 之後的 Windows 作業系統都有支援 APIPA。

2013年3月1日 星期五

Resetting a USB Stick, for Windows


To uninstall Tails from a USB stick, and use it for something else, you have to reset it.
The content of the USB stick will be lost in the operation, but an attacker might still be able to tell that Tails was installed on the USB stick using data recovery techniques unless you securely clean all the available disk space afterwards.
The following instructions do not work on Windows XP.
The version of Diskpart does not list removable disks.

Using Diskpart

You might overwrite any hard drive on the computer.
If at some point you are not sure about the disk number, stop proceeding.
  1. Make sure that the USB stick that you want to reset is unplugged.
  2. Click on the Start button, and choose All Programs ▸ Accessories ▸ Command Prompt, to open the Command Prompt,
    More help on how to start the Command Prompt
  3. Execute the diskpart command, to start Diskpart.
  4. Execute the list disk command to obtain information about each disk in the computer.
    For example:
    Diskpart> list disk
    
      Disk ###  Status      Size     Free     Dyn  Gpt
      --------  ----------  -------  -------  ---  ---
      Disk 0    Online        80 GB      0 B
    
  5. Plug the USB stick that you want to reset. Run the list disk command again.
    A new disk, which corresponds to the USB stick, appears in the list.
    For example:
     Diskpart> list disk
    
       Disk ###  Status      Size     Free     Dyn  Gpt
       --------  ----------  -------  -------  ---  ---
       Disk 0    Online        80 GB      0 B
       Disk 1    Online         4 GB      0 B
    
    Make sure that its size corresponds to the size of the USB that you want to reset. Note down the disk number assigned by Diskpart to the USB stick.
  6. To select the USB stick, execute the following command: select disk=number. Replace number by the disk number of the USB stick that you want to reset.
  7. Execute the clean command to remove all partitioning structures from the USB stick.
  8. Execute the convert mbr command to give the USB stick a partition table.
  9. Execute the create partition primary command to create a new primary partition on the stick.

2013年2月20日 星期三

sed 單行腳本快速參考


文本間隔:
--------

 # 在每一行後面增加一空行
 sed G

 # 將原來的所有空行刪除並在每一行後面增加一空行。
 # 這樣在輸出的文本中每一行後面將有且只有一空行。
 sed '/^$/d;G'

 # 在每一行後面增加兩行空行
 sed 'G;G'

 # 將第一個腳本所產生的所有空行刪除(即刪除所有偶數行)
 sed 'n;d'

 # 在匹配式樣“regex”的行之前插入一空行
 sed '/regex/{x;p;x;}'

 # 在匹配式樣“regex”的行之後插入一空行
 sed '/regex/G'

 # 在匹配式樣“regex”的行之前和之後各插入一空行
 sed '/regex/{x;p;x;G;}'

編號:
--------

 # 為文件中的每一行進行編號(簡單的左對齊方式)。這裡使用了“製表符”
 # (tab,見本文末尾關於'\t'的用法的描述)而不是空格來對齊邊緣。
 sed = filename | sed 'N;s/\n/\t/'

 # 對文件中的所有行編號(行號在左,文字右端對齊)。
 sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'

 # 對文件中的所有行編號,但只顯示非空白行的行號。
 sed '/./=' filename | sed '/./N; s/\n/ /'

 # 計算行數(模擬"wc -l")
 sed -n '$='

文本轉換和替代:
--------

 # Unix環境:轉換DOS的新行符(CR/LF)為Unix格式。
 sed 's/.$//' # 假設所有行以CR/LF結束
 sed 's/^M$//' # 在bash/tcsh中,將按Ctrl-M改為按Ctrl-V
 sed 's/\x0D$//' # ssed、gsed 3.02.80,及更高版本

 # Unix環境:轉換Unix的新行符(LF)為DOS格式。
 sed "s/$/`echo -e \\\r`/" # 在ksh下所使用的命令
 sed 's/$'"/`echo \\\r`/" # 在bash下所使用的命令
 sed "s/$/`echo \\\r`/" # 在zsh下所使用的命令
 sed 's/$/\r/' # gsed 3.02.80 及更高版本

 # DOS環境:轉換Unix新行符(LF)為DOS格式。
 sed "s/$//" # 方法 1
 sed -np # 方法 2

 # DOS環境:轉換DOS新行符(CR/LF)為Unix格式。
 # 下面的腳本只對UnxUtils sed 4.0.7 及更高版本有效。要識別UnxUtils版本的
 # sed可以通過其特有的“--text”選項。你可以使用幫助選項(“--help”)看
 # 其中有無一個“--text”項以此來判斷所使用的是否是UnxUtils版本。其它DOS
 # 版本的的sed則無法進行這一轉換。但可以用“tr”來實現這一轉換。
 sed "s/\r//" infile >outfile # UnxUtils sed v4.0.7 或更高版本
 tr -d \r outfile # GNU tr 1.22 或更高版本

 # 將每一行前導的“空白字符”(空格,製表符)刪除
 # 使之左對齊
 sed 's/^[ \t]*//' # 見本文末尾關於'\t'用法的描述

 # 將每一行拖尾的“空白字符”(空格,製表符)刪除
 sed 's/[ \t]*$//' # 見本文末尾關於'\t'用法的描述

 # 將每一行中的前導和拖尾的空白字符刪除
 sed 's/^[ \t]*//;s/[ \t]*$//'

 # 在每一行開頭處插入5個空格(使全文向右移動5個字符的位置)
 sed 's/^/ /'

 # 以79個字符為寬度,將所有文本右對齊
 sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # 78個字符外加最後的一個空格

 # 以79個字符為寬度,使所有文本居中。在方法1中,為了讓文本居中每一行的前
 # 頭和後頭都填充了空格。在方法2中,在居中文本的過程中只在文本的前面填充
 # 空格,並且最終這些空格將有一半會被刪除。此外每一行的後頭並未填充空格。
 sed -e :a -e 's/^.\{1,77\}$/ & /;ta' # 方法1
 sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/' # 方法2

 # 在每一行中查找字串“foo”,並將找到的“foo”替換為“bar”
 sed 's/foo/bar/' # 只替換每一行中的第一個“foo”字串
 sed 's/foo/bar/4' # 只替換每一行中的第四個“foo”字串
 sed 's/foo/bar/g' # 將每一行中的所有“foo”都換成“bar”
 sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替換倒數第二個“foo”
 sed 's/\(.*\)foo/\1bar/' # 替換最後一個“foo”

 # 只在行中出現字串“baz”的情況下將“foo”替換成“bar”
 sed '/baz/s/foo/bar/g'

 # 將“foo”替換成“bar”,並且只在行中未出現字串“baz”的情況下替換
 sed '/baz/!s/foo/bar/g'

 # 不管是“scarlet”“ruby”還是“puce”,一律換成“red”
 sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' #對多數的sed都有效
 gsed 's/scarlet\|ruby\|puce/red/g' # 只對GNU sed有效

 # 倒置所有行,第一行成為最後一行,依次類推(模擬“tac”)。
 # 由於某些原因,使用下面命令時HHsed v1.5會將文件中的空行刪除
 sed '1!G;h;$!d' # 方法1
 sed -n '1!G;h;$p' # 方法2

 # 將行中的字符逆序排列,第一個字成為最後一字,……(模擬“rev”)
 sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

 # 將每兩行連接成一行(類似“paste”)
 sed '$!N;s/\n/ /'

 # 如果當前行以反斜杠“\”結束,則將下一行並到當前行末尾
 # 並去掉原來行尾的反斜杠
 sed -e :a -e '/\\$/N; s/\\\n//; ta'

 # 如果當前行以等號開頭,將當前行並到上一行末尾
 # 並以單個空格代替原來行頭的​​“=”
 sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'

 # 為數字字串增加逗號分隔符號,將“1234567”改為“1,234,567”
 gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta' # GNU sed
 sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' # 其他sed

 # 為帶有小數點和負號的數值增加逗號分隔符(GNU sed)
 gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta '

 # 在每5行後增加一空白行(在第5,10,15,20,等行後增加一空白行)
 gsed '0~5G' # 只對GNU sed有效
 sed 'n;n;n;n;G;' # 其他sed

選擇性地顯示特定行:
--------

 # 顯示文件中的前10行(模擬“head”的行為)
 sed 10q

 # 顯示文件中的第一行(模擬“head -1”命令)
 sed q

 # 顯示文件中的最後10行(模擬“tail”)
 sed -e :a -e '$q;N;11,$D;ba'

 # 顯示文件中的最後2行(模擬“tail -2”命令)
 sed '$!N;$!D'

 # 顯示文件中的最後一行(模擬“tail -1”)
 sed '$!d' # 方法1
 sed -n '$p' # 方法2

 # 顯示文件中的倒數第二行
 sed -e '$!{h;d;}' -ex # 當文件中只有一行時,輸入空行
 sed -e '1{$q;}' -e '$!{h;d;}' -ex # 當文件中只有一行時,顯示該行
 sed -e '1{$d;}' -e '$!{h;d;}' -ex # 當文件中只有一行時,不輸出

 # 只顯示匹配正則表達式的行(模擬“grep”)
 sed -n '/regexp/p' # 方法1
 sed '/regexp/!d' # 方法2

 # 只顯示“不”匹配正則表達式的行(模擬“grep -v”)
 sed -n '/regexp/!p' # 方法1,與前面的命令相對應
 sed '/regexp/d' # 方法2,類似的語法

 # 查找“regexp”並將匹配行的上一行顯示出來,但並不顯示匹配行
 sed -n '/regexp/{g;1!p;};h'

 # 查找“regexp”並將匹配行的下一行顯示出來,但並不顯示匹配行
 sed -n '/regexp/{n;p;}'

 # 顯示包含“regexp”的行及其前後行,並在第一行之前加上“regexp”所
 # 在行的行號(類似“grep -A1 -B1”)
 sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -eh

 # 顯示包含“AAA”、“BBB”或“CCC”的行(任意次序)
 sed '/AAA/!d; /BBB/!d; /CCC/!d' # 字串的次序不影響結果

 # 顯示包含“AAA”、“BBB”和“CCC”的行(固定次序)
 sed '/AAA.*BBB.*CCC/!d'

 # 顯示包含“AAA”“BBB”或“CCC”的行(模擬“egrep”)
 sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -ed # 多數sed
 gsed '/AAA\|BBB\|CCC/!d' # 對GNU sed有效

 # 顯示包含“AAA”的段落(段落間以空行分隔)
 # HHsed v1.5 必須在“x;”後加入“G;”,接下來的3個腳本都是這樣
 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'

 # 顯示包含“AAA”“BBB”和“CCC”三個字串的段落(任意次序)
 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

 # 顯示包含“AAA”、“BBB”、“CCC”三者中任一字串的段落(任意次序)
 sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -ed
 gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d' # 只對GNU sed有效

 # 顯示包含65個或以上字符的行
 sed -n '/^.\{65\}/p'

 # 顯示包含65個以下字符的行
 sed -n '/^.\{65\}/!p' # 方法1,與上面的腳本相對應
 sed '/^.\{65\}/d' # 方法2,更簡便一點的方法

 # 顯示部分文本——從包含正則表達式的行開始到最後一行結束
 sed -n '/regexp/,$p'

 # 顯示部分文本——指定行號範圍(從第8至第12行,含8和12行)
 sed -n '8,12p' # 方法1
 sed '8,12!d' # 方法2

 # 顯示第52行
 sed -n '52p' # 方法1
 sed '52!d' # 方法2
 sed '52q;d' # 方法3, 處理大文件時更有效率

 # 從第3行開始,每7行顯示一次    
 gsed -n '3~7p' # 只對GNU sed有效
 sed -n '3,${p;n;n;n;n;n;n;}' # 其他sed

 # 顯示兩個正則表達式之間的文本(包含)
 sed -n '/Iowa/,/Montana/p' # 區分大小寫方式

選擇性地刪除特定行:
--------

 # 顯示通篇文檔,除了兩個正則表達式之間的內容
 sed '/Iowa/,/Montana/d'

 # 刪除文件中相鄰的重複行(模擬“uniq”)
 # 只保留重複行中的第一行,其他行刪除
 sed '$!N; /^\(.*\)\n\1$/!P; D'

 # 刪除文件中的重複行,不管有無相鄰。注意hold space所能支持的緩存
 # 大小,或者使用GNU sed。
 sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'

 # 刪除除重複行外的所有行(模擬“uniq -d”)
 sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'

 # 刪除文件中開頭的10行
 sed '1,10d'

 # 刪除文件中的最後一行
 sed '$d'

 # 刪除文件中的最後兩行
 sed 'N;$!P;$!D;$d'

 # 刪除文件中的最後10行
 sed -e :a -e '$d;N;2,10ba' -e 'P;D' # 方法1
 sed -n -e :a -e '1,10!{P;N;D;};N;ba' # 方法2

 # 刪除8的倍數行
 gsed '0~8d' # 只對GNU sed有效
 sed 'n;n;n;n;n;n;n;d;' # 其他sed

 # 刪除匹配式樣的行
 sed '/pattern/d' # 刪除含pattern的行。當然pattern
                                       # 可以換成任何有效的正則表達式

 # 刪除文件中的所有空行(與“grep '.' ”效果相同)
 sed '/^$/d' # 方法1
 sed '/./!d' # 方法2

 # 只保留多個相鄰空行的第一行。並且刪除文件頂部和尾部的空行。
 # (模擬“cat -s”)
 sed '/./,/^$/!d' #方法1,刪除文件頂部的空行,允許尾部保留一空行
 sed '/^$/N;/\n$/D' #方法2,允許頂部保留一空行,尾部不留空行

 # 只保留多個相鄰空行的前兩行。
 sed '/^$/N;/\n$/N;//D'

 # 刪除文件頂部的所有空行
 sed '/./,$!d'

 # 刪除文件尾部的所有空行
 sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' # 對所有sed有效
 sed -e :a -e '/^\n*$/N;/\n$/ba' # 同上,但只對gsed 3.02.*有效

 # 刪除每個段落的最後一行
 sed -n '/^$/{p;h;};/./{x;/./p;}'

特殊應用:
--------

 # 移除手冊頁(man page)中的nroff標記。在Unix System V或bash shell下使
 # 用'echo'命令時可能需要加上-e 選項。
 sed "s/.`echo \\\b`//g" # 外層的雙括號是必須的(Unix環境)
 sed 's/.^H//g' # 在bash或tcsh中, 按Ctrl-V 再按Ctrl-H
 sed 's/.\x08//g' # sed 1.5,GNU sed,ssed所使用的十六進制的表示方法

 # 提取新聞組或e-mail 的郵件頭
 sed '/^$/q' # 刪除第一行空行後的所有內容

 # 提取新聞組或e-mail 的正文部分
 sed '1,/^$/d' # 刪除第一行空行之前的所有內容

 # 從郵件頭提取“Subject”(標題欄字段),並移除開頭的“Subject:”字樣
 sed '/^Subject: */!d; s///;q'

 # 從郵件頭獲得回复地址
 sed '/^Reply-To:/q; /^From:/h; /./d;g;q'

 # 獲取郵件地址。在上一個腳本所產生的那一行郵件頭的基礎上進一步的將非電郵
 # 地址的部分剃除。(見上一腳本)
 sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'

 # 在每一行開頭加上一個尖括號和空格(引用信息)
 sed 's/^/> /'

 # 將每一行開頭處的尖括號和空格刪除(解除引用)
 sed 's/^> //'

 # 移除大部分的HTML標籤(包括跨行標籤)
 sed -e :a -e 's/<[^>]*>//g;/
# 將分成多卷的uuencode文件解碼。移除文件頭信息,只保留uuencode編碼部分。 # 文件必須以特定順序傳給sed。下面第一種版本的腳本可以直接在命令行下輸入; # 第二種版本則可以放入一個帶執行權限的shell腳本中。(由Rahul Dhesi的一 # 個腳本修改而來。) sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode # vers. 1 sed '/^end/,/^begin/d' "$@" | uudecode # vers. 2 # 將文件中的段落以字母順序排序。段落間以(一行或多行)空行分隔。GNU sed使用 # 字元“\v”來表示垂直製表符,這裡用它來作為換行符的佔位符——當然你也可以 # 用其他未在文件中使用的字符來代替它。 sed '/./{H;d;};x;s/\n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}= /\n/g' gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/' # 分別壓縮每個.TXT文件,壓縮後刪除原來的文件並將壓縮後的.ZIP文件 # 命名為與原來相同的名字(只是擴展名不同)。(DOS環境:“dir /b” # 顯示不帶路徑的文件名)。 echo @echo off >zipup.bat dir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat 使用SED:Sed接受一個或多個編輯命令,並且每讀入一行後就依次應用這些命令。 當讀入第一行輸入後,sed對其應用所有的命令,然後將結果輸出。接著再讀入第二 行輸入,對其應用所有的命令……並重複這個過程。上一個例子中sed由標準輸入設 備(即命令解釋器,通常是以管道輸入的形式)獲得輸入。在命令行給出一個或多 個文件名作為參數時,這些文件取代標準輸入設備成為sed的輸入。sed的輸出將被 送到標準輸出(顯示器)。因此: cat filename | sed '10q' # 使用管道輸入 sed '10q' filename # 同樣效果,但不使用管道輸入 sed '10q' filename > newfile # 將輸出轉移(重定向)到磁盤上 要了解sed命令的使用說明,包括如何通過腳本文件(而非從命令行)來使用這些命 令,請參閱《sed & awk》第二版,作者Dale Dougherty和Arnold Robbins (O'Reilly,1997;http://www.ora.com),《UNIX Text Processing》,作者 Dale Dougherty和Tim O'Reilly(Hayden Books,1987)或者是Mike Arst寫的教 程——壓縮包的名稱是“U-SEDIT2.ZIP”(在許多站點上都找得到)。要發掘sed 的潛力,則必須對“正則表達式”有足夠的理解。正則表達式的資料可以看 《Mastering Regular Expressions》作者Jeffrey Friedl(O'reilly 1997)。 Unix系統所提供的手冊頁(“man”)也會有所幫助(試一下這些命令 “man sed”、“man regexp”,或者看“man ed”中關於正則表達式的部分),但 手冊提供的信息比較“抽象”——這也是它一直為人所詬病的。不過,它本來就不 是用來教初學者如何使用sed或正則表達式的教材,而只是為那些熟悉這些工具的人 提供的一些文本參考。 括號語法:前面的例子對sed命令基本上都使用單引號('...')而非雙引號 ("...")這是因為sed通常是在Unix平台上使用。單引號下,Unix的shell(命令 解釋器)不會對美元符($)和後引號(`...`)進行解釋和執行。而在雙引號下 美元符會被展開為變量或參數的值,後引號中的命令被執行並以輸出的結果代替 後引號中的內容。而在“csh”及其衍生的shell中使用感嘆號(!)時需要在其前 面加上轉義用的反斜杠(就像這樣:\!)以保證上面所使用的例子能正常運行 (包括使用單引號的情況下)。DOS版本的Sed則一律使用雙引號("...")而不是 引號來圈起命令。 '\t'的用法:為了使本文保持行文簡潔,我們在腳本中使用'\t'來表示一個製表 符。但是現在大部分版本的sed還不能識別'\t'的簡寫方式,因此當在命令行中為 腳本輸入製表符時,你應該直接按TAB鍵來輸入製表符而不是輸入'\t'。下列的工 具軟件都支持'\t'做為一個正則表達式的字元來表示製表符:awk、perl、HHsed、 sedmod以及GNU sed v3.02.80。 不同版本的SED:不同的版本間的sed會有些不同之處,可以想像它們之間在語法上 會有差異。具體而言,它們中大部分不支持在編輯命令中間使用標籤(:name)或分 支命令(b,t),除非是放在那些的末尾。這篇文檔中我們盡量選用了可移植性較高 的語法,以使大多數版本的sed的用戶都能使用這些腳本。不過GNU版本的sed允許使 用更簡潔的語法。想像一下當讀者看到一個很長的命令時的心情: sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -ed 好消息是GNU sed能讓命令更緊湊: sed '/AAA/b;/BBB/b;/CCC/b;d' # 甚至可以寫成 sed '/AAA\|BBB\|CCC/b;d' 此外,請注意雖然許多版本的sed接受象“/one/ s/RE1/RE2/”這種在's'前帶有空 格的命令,但這些版本中有些卻不接受這樣的命令:“/one/! s/RE1/RE2/”。這時 只需要把中間的空格去掉就行了。 速度優化:當由於某種原因(比如輸入文件較大、處理器或硬盤較慢等)需要提高 命令執行速度時,可以考慮在替換命令(“s/.../.../”)前面加上地址表達式來 提高速度。舉例來說: sed 's/foo/bar/g' filename # 標準替換命令 sed '/foo/ s/foo/bar/g' filename # 速度更快 sed '/foo/ s//bar/g' filename # 簡寫形式 當只需要顯示文件的前面的部分或需要刪除後面的內容時,可以在腳本中使用“q” 命令(退出命令)。在處理大的文件時,這會節省大量時間。因此: sed -n '45,50p' filename # 顯示第45到50行 sed -n '51q;45,50p' filename # 一樣,但快得多 如果你有其他的單行腳本想與大家分享或者你發現了本文檔中錯誤的地方,請發電 子郵件給本文檔的作者(Eric Pement)。郵件中請記得提供你所使用的sed版本、 該sed所運行的操作系統及對問題的適當描述。本文所指的單行腳本指命令行的長 度在65個字符或65個以下的sed腳本〔譯註1〕。本文檔的各種腳本是由以下所列作 者所寫或提供: Al Aab # 建立了“seders”郵件列表 Edgar Allen # 許多方面 Yiorgos Adamopoulos # 許多方面 Dale Dougherty # 《sed & awk》作者 Carlos Duarte # 《do it with sed》作者 Eric Pement # 本文檔的作者 Ken Pizzini # GNU sed v3.02 的作者 SG Ravenhall # 去html標籤腳本 Greg Ubben # 有諸多貢獻並提供了許多幫助 -------------------------------------------------- ----------------------- 譯註1:大部分情況下,sed腳本無論多長都能寫成單行的形式(通過`-e'選項和`;' 號)——只要命令解釋器支持,所以這裡說的單行腳本除了能寫成一行還對長度有 所限制。因為這些單行腳本的意義不在於它們是以單行的形式出現。而是讓用戶能 方便地在命令行中使用這些緊湊的腳本才是其意義所在。

libiptc



Querying libiptc HOWTO


http://tldp.org/HOWTO/Querying-libiptc-HOWTO/



Linux防火墙netfilter的编程接口libiptc简介


How to repair and clone disk with ddrescue

  ddrescue  is a tool that can be used to repair and clone disks on a  Linux system . This includes hard drives, partitions, DVD discs, flas...