2009年11月23日 星期一

日本中國

如果我說中國是日本的一部份。中國都該稱為日本中國,二次大戰沒有美國,中國早就是日本的領土,中國人你們做何感想?

清單上沒有我的國家,有一個歧視我國的字眼出現,我若選了就是自取其辱;我不像國民黨員,不會做這種不知廉恥的羞辱國家的行徑。

一個玩弄民族主義、堅持共產主義的貪婪政權,自以為經濟強大,殊不知自己人民的道德與操守跟經濟完全不能相提並論;原本要下載RHEL5來測試的,操你媽的中國,老子拒用Redhat Linux!

2009年11月17日 星期二

ctime, atime與mtime釋疑

每個檔案都有屬性及內容。除了檔案內容很重要外,時間標記也非常重要--系統管理員可以藉由時間標記進行備份、例行性檢查;使用者可以從時間標記找出重要的檔案,硬碟的I/O也依靠時間標記(time flag)來進行處理。

UNIX系統將時間標記分成三種:

  1. atime(Access time):檔案上次被讀取的時間。
  2. ctime(status Change time):檔案的屬性或內容上次被修改的時間。
  3. mtime(Modified time):檔案的內容上次被修改的時間。

我們可以用一個很簡單的script來印證這些東西。

姑且把他命名為showTime.sh

1. 假設我們建立一個新檔:

touch newFile
執行showTime.sh,你會發現三種時間是相同的:
ctime: Nov 17 23:14
atime: Nov 17 23:14
mtime: Nov 17 23:14
2. 隔一分鐘後,寫入一些東西到檔案裡面:
echo "1st modified" > newFile
結果發現:
ctime: Nov 17 23:15
atime: Nov 17 23:14
mtime: Nov 17 23:15
3. 再隔一分鐘後,讀取這個檔案但不更動內容:
cat newFile
結果發現:
ctime: Nov 17 23:15
atime: Nov 17 23:16
mtime: Nov 17 23:15
4. 在隔一分鐘,僅修改屬性:
chmod g+wx newFile
結果發現:
ctime: Nov 17 23:17
atime: Nov 17 23:16
mtime: Nov 17 23:15

從這個lab裡我們可以得到以下結論:

  • ls -l所列出的長資訊,該時間是mtime。
  • 如果利用touch某檔案,則三種時間屬性均被更新。
  • 如果你修改了某一檔案內容,則ctime與mtime會更新。
  • 如果某檔案僅被讀取或另存新檔,則只有atime會被改變。
  • 如果你只改變檔案屬性(如權限、檔名、所有人或是suid、acl、chattr等),則只有ctime被更新。
  • atime相較之下是最常變動的時間標記,可以將之關閉以增進I/O,特別是多人多工,小檔案多以及laptop環境。filesystem設定裡可以增加noatime屬性,或是chattr +A固定住atime(chattr僅適用於ext2/3/4系列的filesystem)

2009年11月12日 星期四

linux上的pdf合併-刪除-旋轉-編輯-加密-破解密碼筆記

PDF檔案格式是目前最重要的檔案格式之一,因為她可以確實保留住檔案的格式,包含字型以及圖形顏色、比例,並且提供解析度極高的列印效果。本文僅就最常用的合併、拆解、旋轉、加解密,以及簡單的編輯功能作筆記。

pdftk(pdf toolkit)是一套可以拆解、合併pdf的超實用小工具,還可以進行加解密,頁面旋轉、解出metedata,書籤、資料欄位等非常多專業功能!解決了往常只有Adobe Acrobat Professional才能使用的功能。隨著pdf越來越普及,字型跟格式都越來越要求跟在不同平台下有完全相同的呈現方式,我們確實是需要學習這樣的實用工具。更棒的是,他是開放原始碼並且以GPL授權的軟體,在許多linux上都是可以直接安裝的,太方便了!
以下我僅翻譯網頁中的範例,在加上自己的註解作為筆記。

  1. 合併多個pdf檔:
    pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf
  2. 從數個pdf檔取出某幾頁並合併成另一個檔案:
    pdftk A=1.pdf B=2.pdf cat A1-7odd B2-endeven output combined.pdf
    取出1.pdf的1,3,5,7頁跟2.pdf的2~最末頁,合併成combined.pdf
  3. 頁面旋轉:
    pdftk src.pdf cat 1E 2-endoddW 2-endevenS output.pdf
    第一頁順時針旋轉90度,之後的奇數頁逆時針90度,偶數頁轉180度。
    其中,E=R(right), S=D(down), W=L(left),當然也可以ESW跟RDL混用。
  4. 整份文件上下顛倒:
    如上,其實就是使用D或S參數:
    pdftk src.pdf cat 1-endS output rotated.pdf
  5. 加密pdf檔案:
    pdftk預設的加密強度是128bits,範例如下:
    pdftk plane.pdf output encypt.pdf owner_pw 加密密碼
    另一個強度較小的為40bits,他可以節省不小檔案大小:
    pdftk plane.pdf output encrypt.pdf owner_pw 加密密碼 encrypt_40bit
  6. 加密檔案其實只是限制你不能修改某些受限的部份,如果要求輸入密碼才能開啟這份pdf檔:
    pdftk encrypt.pdf output lock-encrypt.pdf user_pw 使用者密碼
  7. 解密檔案:
    pdftk encrypt.pdf input_pw 加密密碼 output decrypt.pdf
  8. 檔案加密還為了防止他人複製、修改及列印內容。要允許使用者可以列印:
    pdftk plane.pdf output encrypt.pdf owner_pw 加密密碼 user_pw 使用者密碼 allow printing
    允許的動作如下:
    1. Printing

      高品質列印
    2. DegradedPrinting

      低品質列印
    3. ModifyContents

      允許修改內容(包含架構)
    4. Assembly

      僅允許修改架構
    5. CopyContents

      Also allows ScreenReaders
    6. ScreenReaders

      ...這個不是很懂
    7. ModifyAnnotations

      可修改註解
    8. FillIn

      ...這個不是很懂
    9. AllFeatures

      以上所有的options全都開放。
  9. 合併兩個檔案成一個為加密的檔;其中一個檔為加密檔案:
    pdftk A=encrypt.pdf B=plane.pdf input_pw A=加密密碼 cat A B output combined.pdf
  10. (少用)若pdf的page串流有經過壓縮,則會無法修改pdf code。利用uncompress來解壓縮:
    pdftk src.pdf output plane.pdf uncompress
    同理,你也可以下compress指令來壓縮。
  11. 將pdf檔每一頁獨立存成個別的pdf檔:利用burst指令
    pdftk large.pdf burst
    他會在當前目錄產生一個doc_data.txt的log檔作為紀錄。
  12. (少用)修復資料串流長度以及XREF table:
    pdftk broken.pdf output fixed.pdf
  13. (少用)加入浮水印:
    pdftk contents.pdf background Watermark.pdf output contents_WM.pdf
    pdftk contents.pdf stamp Watermark.pdf output contents_WM.pdf
    從指令上也能看出是否要讓浮水印蓋過圖片,細節上還請參考Lloyd神人的在 PDF 上加浮水印
  14. 印出pdf檔裡所有的metedata(就是書籤、頁籤、所有屬性等等):
    pdftk A.pdf dump_data output report.txt

事實上還有更多細節的功能,不過礙於自己也不是很懂,節錄這些常用的功能應該就非常足夠。另外,關於PDF密碼的一些概念,這裡作一些簡單的介紹。pdf的「密碼」大致兩種類型,一種叫Document-open password,另一種則是Permission password。Document-open password是開啟這個pdf檔所需要的密碼,跟使用者比較相關,也稱之為user_pw;Permission password比較像是administrator/owner的密碼,只有所有人才能修改裡面的內容以及關鍵屬性,又稱之為owner_pw。在pdf 1.4以及更早的時代(也就是acrobat 5.0),加密強度僅40bits;到了現在強度已經到128bits;到了Acrobat 9.0以後,導入了AES加密演算法之後,加密強度已經高達256bits,不過pdftk還不支援這麼高的強度;就算支援,做雜湊加密跟解密的時間也會很久。

其實你還可以找到pdftk的gui版本--GUI for pdftk,該作者也大方的提供了各種不同版本給各種作業系統使用,不過他所使用的函式庫實在是太舊了,就算我用軟連結仿造一個他要的版本給他,在執行上仍會有macro mismatch的錯誤,反正pdktk幾乎是無敵的,我也就不理會是否有圖形介面了。

在Windows下有著名的軟體:PDF password recovery--能破解pdf密碼的障礙,那麼在linux底下呢?

pdfcrack是一套基於GPL的開放原始碼的程式,她自動偵測加密長度,並且用內建字典逐個測試。破解密碼時間的長短仰賴於cpu的能力。sourseforge僅提供原始碼,不過別擔心,編譯一定會成功的,只要你有裝gcc的話。


另一個方法是使用wine去模擬windows下破解pdf密碼的軟體。我以pdf password remover做測試,並且利用pdftk隨便加密一個pdf來試驗,發現雖然她似乎能很快的
產生一個乾淨的pdf檔,但是我的pdf內容卻全部被清空!不知道是wine的原因還是如何,總是這看來不太成功。

另一個解決方案則是GuaPDF。GuaPDF這間公司提供了Demo, Local Quad, Distributed以及UNLIMITED四種版本,包含solaris,linux,windows,macos四種平台。Demo版本是免費使用的,如果你的顯示卡是nvidia的晶片且安裝了cuda驅動程式,解密速度可以比一般僅用cpu功能的電腦快上七倍。

linux Demo
MacOS Demo(Intel)
Solaris Demo
Solaris x86 Demo



利用GuaPDF能快速的產生一個未經加密的pdf檔,解密之後用Acrobat reader可能會有一些錯誤訊息,這是很正常的。


但是畢竟是demo版,您可能會遇到下列錯訊息:

  Guaranteed PDF Decrypter v. 3.1 (freeware DEMO version) - CPU version
 (c) PSW-soft, 2000-09, by P. Semjanov, S. Lysak. http://www.guapdf.com
 This product includes software developed by the OpenSSL Project
 for use in the OpenSSL Toolkit. (http://www.openssl.org/)

'Corring, Kay, JP 2001, slab window Argentina.pdf' is the uncompressed document with 40-bit RC4 encryption
This document has no user password, only restrictions present

Key found! (exact value is  7F 7A AC E3 FC)
Would you like to decrypt it now?y
Decryption in progress, please wait...
  0% complete
Warning: Demo limitation reached in line 430
Your file is 100% supported by GuaPDF and decryption is guaranteed, but
demo limitation was reached and file was not fully decrypted and saved as
'Corring, Kay, JP 2001, slab window Argentina.decrypted.pdf'.
It may contain only few (or zero) readable pages and/or produce any error messages.
Please get the full version to correctly decrypt this file.
這是因為demo版限制只能用在430行以內的pdf檔,只好依照需求去跟他買羅~

所以現在我可以用pdftk來任意整理我的pdf文件,GuaPDF來克服某些學術檔案無法列印或複製的問題。

如果要編輯pdf檔案本身,除了要有好工具之外,還需要會一些pdf的語法,這就超過了筆者的能力範圍;不過簡易的修改pdf,仍然可以透過pdfedit這個小程式來幫忙:


pdfedit可以從套件庫裡直接安裝喔!建議閱讀官方網站提供的閱讀文件。如此一來,編修pdf檔時就不需要用vbox開一個windows又使用盜版軟體了!

2009年10月20日 星期二

自動重開機500次?

在bbs的linux版上看到有網友想找可以自動reboot500次的linux程式,我覺得很有趣;不過一下就把script公佈出來,一點趣味也沒有。所以我就先把解答寫在這裡,也許有一天,他會找到這篇。

重開機500次可能是要測試硬體吧,這就超過我的專長;不過自動重開機卻可以用8行不到的script輕鬆解決:

修改/etc/rc.local,新增一行如下:

[ -e /boot/autoReboot.sh ] && bash /boot/autoReboot.sh
然後新增一個/boot/autoReboot.sh內容如下:

所需要會的技巧相當簡單:
1. 會使用while loop。
2. 會使用test敘述。
3. 會使用shell script裡的整數運算(雖然他非常陽春)。
4. 會使用function(雖然他非常陽春)。
5. 知道開機時要額外啟動的命令檔為何。

2009年10月10日 星期六

大小寫互換--進階版

最近用select寫了一個進階版的大小寫互換程式,供各位參考。

2009年10月1日 星期四

變數值代換(variables substitution)精簡筆記

變數值代換相較於指令代換,是一般使用者比較少碰到的;不過當你要成為一位合格的bash/csh programmer,變數值代換可是要跟吃飯喝水一樣自然。

Case 1. ${variable-'defaultValue'}
意義:當variable不存在時,將variable暫時指定成defaultValue。所謂「暫時」,是指此行之後,在整個script裡variable都還是不存在此變數名稱。

結果:

Maxsolar
       <---沒有輸出
可以發現,第一行的Maxsolar是利用變數值替換得來的,但是事實上我們並沒有真的設定myname,因此echo的結果為無。

Case 2. ${variable:-'defaultValue'}
意義:當variable不存在或為空值時,將variable暫時指定成defaultValue。所謂「暫時」,是指此行之後,在整個script裡variable都還是不存在或變數值不改變。

結果:

Maxsolar
       <---空的輸出
可以發現,由於myname存在但為空值,因此暫時被設定成Maxsolar,但隨即變失去了Maxsolar這個值,因此第一行輸出Maxsolar,第二行的輸出為空值(請注意跟case 1的「沒有輸出」看起來一樣,意義卻不相同)。

Case 3. ${variable:='defaultValue'}
意義:表示variable若不存在或為空值,則指定defaultValue給variable。variable將在整個script裡都為defalutValue。
這是最為常見的變數值替換。

結果:

Maxsolar
Maxsolar
可以發現,由於myname是空值,因此利用":="將myname的值永久設定成Maxsolar(所謂永久,指的是在此script的生命週期裡)。因此兩個輸出都會是Maxsolar。
事實上,在我們的終端機裡控制命令列最前面的 使用者名稱@主機名稱:工作路徑 的這個表示法,就是在~/.bashrc裡利用此變數替換方法來達成的:

Case 4. ${variable:?'defaultValue'}
意義:若variable不存在或為空值,則會出現在std err上,以檢查變數值是否被正確設定。
此變數值替代表示法常用在debug,而不會真正用在可執行的script上,遇到錯誤就會直接停止,無法利用std err導向輸出。

結果:

test.sh: line 32: myname: Maxsolar
因為myname被預期設定值為Maxsolar,但是卻是空值,因此會觸發一個標準錯誤輸出,script嘎然而止。

Case 5. ${variable:+'defaultValue'}
意義:表示variable若已被設定,則本行的variable暫時被設定為defalutValue,但整個script裡的variable未被改變。

結果:

maxubuntu
Maxsolar
可以發現:myname非空值,因此將會被暫時設定成maxubuntu;但是myname的值不會因此改變,仍然是Maxsolar。

好險,變數值的替換就這五種類型,多看個兩次就可以完全懂了。

小節:

  1. 只想測試變數是否為空值:
    可以用"-", ":-"來檢查,且指定的值只有一行的生命。
  2. 若某變數沒有值,就賦值給他:
    可以用":="來指定
  3. 想檢查該變數值是否為某值:
    利用":?"來debug囉!!
  4. 想臨時改變某一個有值的變數:
    利用":+"來賦值。
  5. 想永久改變某一個有值的變數:
    婀,你一定忘記變數值是可以被override的!直接將某變數指定值給他就可以啦!別想太複雜囉!

2009年9月22日 星期二

檢查目錄下的檔案或資料夾數目

這個script,可以幫你檢查當前目錄下,有多少目錄、檔案、隱藏檔以及連結檔。

用法:
只要在該目錄下,直接執行此script即可。