2008年12月3日 星期三

telnet 的解析

作者: Baron. Wan

telnet localhost 25
example.com.tw ......
HELO gmail.com
MAIL FROM: < yyy @ gmail.com >
RCPT TO: < ggg @ uuu.com.tw >
DATA
from: < yyy @ gmail.com >
to: < ggg @ uuu.com.tw >
subject: test
test
.
QUIT

一封信件的檔頭解析如下:
Received: from gmail.com (localhost.localdomain [127.0.0.1])
by example.com.tw
for ggg @ uuu.com.tw
X-Envelope-From: yyy @ gmail.com
Return-Path: yyy @ gmail.com

那個 `by` 為實際發信的地址

procmail ~ 自己寄給自己?

作者: Baron. Wan

有垃圾信偽裝寄件者是自己, 然後寄給自己 O.O?!! 以下是比對了數封的相關垃圾信件後, 做出的處理動作....

:0 H
* ^[fF]rom:
{
FROMUSER=`grep "^[fF]rom:"|sed 's/^.* .* //'|sed 's/^.* //'`
TOUSER=`formail -xReceived:|grep "for"|head -1|sed 's/^.*for //'|awk -F" " '{print $1}'|sed 's/^/\ /'|sed 's/;$//'|sed 's/\ //'`
TOUSER2=`grep "^[tT]o:"|sed 's/^.* .* //'|sed 's/,//'|sed 's/^/\ /'|grep "${FROMUSER}"`
WHOISU=`if [ -n "${TOUSER2}" ]||[ "${FROMUSER}" = "${TOUSER}" ]&&[ -n "${FROMUSER}" ]; then echo "True"; else echo "False"; fi`

:0
* WHOISU ?? True
{
:0f
# to addition black list
| formail -i "X-SPAM-NOTUSER: MAILER_SPAM_NOTFROMUSER"
}
}

procmail ~ 紀錄發信位址

作者: Baron. Wan

:0 H
* ^Received:
{
FROM_MAILDOMAIN=`formail -xReceived:|grep "by"|tail -1|sed 's/^.*by //'|awk -F" " '{print $1}'`

:0f
| formail -i "X-SPAM-FROMDOMAIN: ${FROM_MAILDOMAIN}"
}

那個 Received:...by 是哪裡? 簡單的說 by 之後接的就是發信來源地!
這有甚麼作用呢? 作用很多的. 許多垃圾郵件經過觀察, 發送來源地竟然是在自己的Mail Server ?!! 很奇怪吧, 可是明明就沒中毒...其實一點也不奇怪, 你只要將 smtp 指向可接收外部信件的 mail server, 就可以由那台主機發信啦, 至於可以發送到哪裡, 那要看那台主機有沒有 Relay 囉, 不然只能寄送給主機內的User了. 可是這樣 自己人寄給自己人不就被擋了? 所以上面會去比對發信的來源地.

2008年11月7日 星期五

procmail 的防禦~退信攻擊

作者. Baron. Wan

就在我們公司的客戶反應, 收到 來自許多 不知道對方是誰 的退信, 研究了一下, 發現他們即是所謂的 "退信攻擊", 這是蠻厲害的攻擊手法, 因為退回的信件檔頭永遠是那麼的 "正常", 以至於讓人無法檔, 無從檔起, 再不然乾脆發佈拒絕收任何的退信, 但是我們的客戶是那麼的執著, 堅持正常的退信他們一定要能接收到, 然後不正常的退信要能夠有效的阻擋, 這彷彿是個不太可能的任務, 他們不想將所有廠商加入白名單, 因為他們覺得太多, 很累人 !! 因此這就變成我們必須突破的任務了.
在經過研究後我發現, 其實這些垃圾退信並非無跡可尋, 我們先來討論一下, 退信攻擊的手法: Cracker 在寄發信件時, 串改了檔頭資訊, 然後寄送到遠端的 Mail Server, 由於該信件沒有正確的收件者, 或是檔案過大, 或是該收件者的信箱容量已爆...等等因素, Mail Server 遂退回該信件, 但是重點來了, 該信件的寄件者已經被串改為不是該本人所寄發, 所以退回的信自然是退到這個倒楣的收件者囉.(因為這封信不是他本人寄的), 不斷的依此路徑進行, 就形成了攻擊手段, 而那個倒楣的收件者, 就殺不勝殺, 垃圾信猶如雪片般的飛來, 逐漸將自己給淹沒了...哈.
廢話不多說, 以下就是在 procmail 實現了阻擋退信攻擊的手法之一.

##for MAILER-DAEMON-ATTACK
:0 H
* ^From:.*(postmaster@|Postmaster@|MAILER-DAEMON@|Mailer-Daemon@)
{
:0 BH
* < 5120000
{
BODY_PLAIN=`formail -I ""`
HOSTNAME=`hostname|awk -F"." '{print $2"."$3"."$4}'`
CHECK_HOSTNAME=""
CHECK_HOSTNAME=`echo -n "${BODY_PLAIN}"|grep "Received: from"|tail -1|grep "${HOSTNAME}"|awk -F" " '{print $3}'|awk -F"." '{print $2"."$3"."$4}'`
HOSTNAME_FLAGS=`if [ -z "${CHECK_HOSTNAME}" ];then echo "True";else echo "False"; fi`

:0
* HOSTNAME_FLAGS ?? True
{
:0f
| formail -i "SPAM_MAILER_DAEMON_ATTACK"
}
}
}



然後, 在自己的濾郵系統當中加入這個 "X-SPAM-MAIL: MAILER_DAEMON_ATTACK" 的黑名單在檔頭

2008年10月22日 星期三

WinRAR 真是強 ~

撰文者: PJ. Wan

原以為這是個不傳的技術, 剛剛卻發現原來網站上已有人刊登.

其實過去, 由於工作需求, 常會製作 自動安裝 執行檔, 將已安裝好的應用程式, 擷取 register 來替代安裝後設定的麻煩, 再編寫個簡單的 DOS 指令, 然後就用這個 WinRAR 的功能, 來製作出一個自動安裝的執行檔. 有興趣的讀者, 可以由 WinRAR 的 help 來查詢到以下這些指令, 以下的 WinRAR 指令皆來自 [http://]forum.shareget.com/t291353-post2662802/ , 這篇文章的作者寫的相當詳盡, 大家也可以去參觀一下.

=====================================================

WINRAR scripts 說明

Delete 解壓縮前先刪除檔案
License 顯示程式的使用授權協定
Overwrite 選擇檔案的覆寫模式
Path 設定預設目標路徑
Presetup 指定解壓縮前執行的程式
SavePath 儲存目的地路徑(儲存路徑在 registry, 當下次再執行自解檔時會自動帶入, Path 參數存在時才有效)
Setup 指定解壓縮後執行的程式
Shortcut 建立解壓縮檔案的捷徑
Silent 跳過開始時的對話方塊
TempMode 解壓縮檔案到暫存資料夾
Text 加入純文字到自解檔對話方塊純文字視窗
Title 設定自解檔對話方塊標題

Delete=<檔案名稱>

在解壓縮到目標資料夾之前刪除指定的檔案,允許數個 Delete 命令。
如果在此指定的檔案被鎖定而無法刪除,自解檔模組在解壓縮前會試著將它臨時重新命名,並在 Windows 重新啟動時刪除它,這能不能成功則取決於 Windows 版本的差異。
範例:

Delete=winrar95.exe

Delete=rarlng.dll

---------------------------------------------------------------------------------------------------

License=<使用授權協議對話方塊標題>

{-
使用授權協定純文字 1
使用授權協定純文字 2

}

當開始自解檔時,顯示軟體的使用授權協定,使用者可以接受,並繼續解壓縮,或拒絕並離開。
License 可以是 HTML 格式或純文字格式。後者自解檔模組會配合對話方塊將指定純文字字串結合和重新格式成最佳狀態,因此如果您希望開始新段落的話,您必須在之前加入一個空字串。
使用 HTML 可以控制顯示的字形、顏色及格式。關於 HTML 的語法在一般網際網路都找得到,或者您也可以用 HTML 編輯程式製作。
範例:

License=最終使用者使用授權協議書

{-
所有版權於 RAR 均屬於作者所專有。

此程式是共享軟體,任何人在測試期限內均可以使用此軟體。
在測試期限過後,您必須註冊。
}

------------------------------------------------------------------------------------------------------------------------------

Overwrite=[n]

如果 [n] 為 0,在覆寫檔案之前使用者將先被詢問。這是 覆寫 命令的預設動作,可以不需要指定。如果 [n] 不存在或是等於 1,檔案將在沒有確認的狀況下全部覆寫。如果 [n] 等於 2,所有已存在的檔案將不會被覆寫。
範例:
Overwrite=1

-----------------------------------------------------------------------------------------------------------------------------

Path=<路徑>

設定預設的目標路徑。路徑的絕對使用起始點在預設下為 <磁碟機號>:,如果 <路徑> 只包含名稱,它將會被附加到 Program Files 資料夾下,如果您不希望這麼做,請從 '.\' 字元開始定義起始 <路徑>。
範例:
設定 [Calc 3.05 beta] 為資料夾名,位置在 [Program Files] 下,當成預設路徑:

Path=Calc 3.05 beta

設定 [C:\Calc] 當作預設路徑:

Path=C:\Calc

設定 [Calc] 在根目錄下當作預設路徑:

Path=.\Calc

---------------------------------------------------------------------------------------------------------------

Presetup=<程式>

自解檔在解壓縮之前將試著執行 <程式>,在執行 <程式> 之前必須先指定目標資料夾。您可以使用此命令,比如說,當安裝新版本於舊版本上面時,用以移除先前的程式版本。
範例:
Presetup=uninstall.exe /clean

------------------------------------------------------------------------------------------------------------------

Setup=<程式>

在成功解壓縮之後自解檔將會試著執行 <程式>。在執行 <程式> 之前,包含已解壓縮檔的資料夾將會設為目前資料夾
範例:
Setup=setup.exe

注意

1) 如果您在使用自解檔執行 InstallShield setup.exe 有問題的話,請試著執行 [setup.exe /SMS] 來代替簡潔的 [setup.exe]。此選項允許自解檔檢測安裝程式的離開。
2) 全部在自解檔命令列所指定的選項都會從 Setup=<程式> 命令提交給程式,自解檔它自己則只認得 -s 選項,也就是強制背景安裝模式而不顯示開始對話方塊。
3) 自解檔模組在安裝之前先設定 sfxname 環境變數。這個變數包含自解檔名稱,所以安裝程式可以預先讀取這類的資訊。

------------------------------------------------------------------------------------------------------------

shortcut=<目標類型>,<來源名稱>,<目標資料夾>,<敘述>,<捷徑名稱>

為解壓的檔案建立一個捷徑。

目標類型 是目標區域種類,可以有下列值:

D 在桌面建立捷徑
S 在 [開始] 功能表建立捷徑
P 在 [開始] 功能表/[程式集] 中建立捷徑
T 在 [啟動] 功能表中建立捷徑
來源名稱 是壓縮檔名稱。

目標資料夾 是建立捷徑的資料夾,如果它不存在,將被自我解壓縮檔建立。
敘述 是敘述捷徑的字串。
捷徑名稱 是由自解檔建立的 .lnk (捷徑) 檔案的檔案名稱。
所有選項用逗號分隔。如果您需要在選項內加入逗號字元,就把整個選項加上引號。如果您要顯示引號,則必須打兩次引號。只有目標類型和來源名稱是必需的,其他選項選用。
範例
在桌面建立在 WinRAR 資料夾中連接到 winrar.exe 的捷徑,帶有 [WinRAR 執行檔] 的敘述和 [WinRAR 壓縮軟體] 的名稱:

Shortcut=D, winrar.exe, WinRAR, "WinRAR 執行檔", "WinRAR 壓縮軟體"

-----------------------------------------------------------------------------------------------------------

Silent[=選項]

開始解壓縮時不顯示開始對話方塊。
選項 可以是 1 或 2。如果 選項 是 1,開始解壓縮對話方塊會完全隱藏,包含進度顯示和檔案名稱。如果 選項 是 2,則跳過開始解壓縮的確認,但使用者仍然可以看到壓縮檔案的解壓縮進程。
範例:
Silent=2

-------------------------------------------------------------------------------------------------------------

TempMode=[問題?述][@視窗標題純文字]

此命令強制自解檔建立一個臨時目錄,將全部檔案解壓縮至此,然後開始執行 Setup 命令所指定的程式,並在完成 Setup 程式之後將臨時目錄中的內容全部清除。當執行這些操作時,自解檔會自動設定為 安靜模式。如果 TempMode 命令存在的話,?述中將有 Setup 命令且不得使用 path 命令。
TempMode 命令可以有字串選項的選項,在解壓縮之前可用以定義問題和問題的標題。這樣的範例,僅在當使用者選擇 [是] 按鈕時才會開始解壓縮。
範例:

a) TempMode
b) TempMode=您希望繼續安裝 Calculator 3.05 嗎?@Calculator 安裝程式

-----------------------------------------------------------------------------------------------------------

Text=<字串>

b)

Text

{-
字串 1
字串 2

}

加入指定純文字或 HTML 字串到自解檔模組的文字輸出視窗。當自解檔模組第一次遇到 Text 命令時,它會重置此視窗在加入 <字串> 之前的預設內容,後續命令則附加 <字串> 到已存在的純文字後。
這種命令語法可以一次加入單行字串或數行字串。
如果使用純文字語法時,自解檔模組會配合對話方塊將指定純文字字串結合和重新格式成最佳狀態,因此如果您希望開始新段落的話,您必須在之前加入一個空字串。
使用 HTML 可以控制顯示的字形、顏色及格式。關於 HTML 的語法在一般網際網路都找得到,或者您也可以用 HTML 編輯程式製作。

範例:

a) 加入單一字串到對話方塊視窗
Text=這是我的新程式

b) 加入指定純文字到對話方塊視窗 [Text

{-
此程式最有趣的特性是:
- 支援 Windows 剪貼簿;
- 每一個處理的檔案大小最大為 10KB;
}

---------------------------------------------------------------------------------------------------------

Title=<標題>

設定自解檔的視窗標題。
範例:
Title==Calculator,版本 3.05

----------------------------------------------------------------------------------------------------------

Title=Bojack Test
TempMode=您希望繼續安裝 MSN 8嗎 ?@Bojack封裝程式
Overwrite=1
Silent=1
Setup=MsnMsgs.msi /passive
Shortcut=D, %ProgramFiles%\MSN Messenger\msnmsgr.exe, , 「WLM執行檔」, 「WLM」

--------------------------------------------------------------------------------------------------------

2008年10月21日 星期二

sendmail (esmtp) 實做 ~

作者: Baron. Wan

這又是應客戶需求添加的,
實做的環境是在 Redhat 當中.

1. 在 /etc/mail/sendmail.cf 加入以下內容:
O AuthMechanisms=LOGIN PLAIN
C{TrustAuthMech}LOGIN PLAIN
O DaemonPortOptions=Port=smtp, Name=MTA

2. 在 /etc/mail/mailertable 加入:
. esmtp:[ ip_addr ]

3. 在 /etc/sysconfig/saslauthd 修改以下參數:
MECH=ldap
FLAGS="-O /etc/saslauthd.conf"

4. 新增 /etc/saslauthd.conf , 加入以下內容:
ldap_servers: ldap://
ldap_version: 3
ldap_bind_dn: cn=dev,cn=Users,dc=example,dc=com,dc=tw
ldap_bind_pw: password
ldap_search_base: cn=Users,dc=example,dc=com,dc=tw #用來作為搜尋的基礎
ldap_auth_method: bind # 驗證的方式?
ldap_filter: samaccountname=%u # 過濾條件為何?
ldap_scope: sub # 搜尋的範圍為何?

5. 在 /usr/lib/sasl2/Sendmail.conf 當中加入:
pwcheck_method:saslauthd
mech_list:LOGIN PLAIN

然後重啟 saslauthd , sendmail try try!!

2008年9月23日 星期二

解開~kernel包新的driver,重新封裝成RPM的神秘面紗吧~

這次要分享的是: 怎樣在 kernel 的編譯當中, 包入新的 driver, 然後包裝為 kernel .rpm 檔案.

作者: Baron. Wan

先將新的驅動程式下載下來, 一般會用到的, 像是 新式的網路卡, 最新的SATA or SAS 硬碟, 這些在 舊式的 kernel 可能都尚未包進去, 而新的驅動程式也要確認有包含在多少的 kernel 版本當中 (2.4 or 2.6), 確認之後, 先給它依照驅動裡面說明 (REAMDE) 來進行安裝, 看是否可正常運作, 如無問題, 則可接下去操作啦.

可以先到 kernel.org 處下載 kernel source code, 通常是 linux-{版本號}.tar.gz , 我習慣將它解到 /usr/src/kernels/ 當中, 緊接著還要去下載需要加入的驅動程式, 將驅動程式放到 /usr/src/kernels/linux-{版本}/drivers/..., 比如: 這個新的驅動程式是屬於 sata, 則放到 scsi/ 的 folder 當中, 建議最好整個 driver 's folder 都 copy 過去, 裡面通常都會有 Makefile, .h, .c or .o 等等可供 compiler 的完整資訊; 編輯 scsi/ folder 裡面的 Makefile, 添加一筆 新的裝置, 內容應該像這樣:
obj-$(CONFIG_SCSI_{your device name}) += libata.o {your device folder}/

[註] libata.o 是否需要加入, 可查看剛剛測試加入新的 module 之後, 在 /lib/modules/`uname -r`/module.dep 裡面, 該 device 是否有延伸的 module 需要驅動, 理論上所有 sata driver 都需要添加 libata.o 這一筆.

之後是添加一筆新的裝置到 Kconfig, 它負責顯示在我們選擇功能上 make *config 的內容裡:
config {device_name}
tristate "show device information,only english"
depends on SCSI_SATA && PCI -- 歸屬於哪個裝置或設備上
default {y|m|n} -- 可設定預設值
help -- 當移到該功能時, 會秀出以下的資訊
........(以下省略)


在要編譯的 kernel-{version}/linux-{version}/ source_code 中,
使用 make mrproper 來清除舊的資料, 如第一次實做則不需要.
使用 make oldconfig or make menuconfig 來將剛剛新建的 driver 含入, 存成 .config

我習慣先行利用 make clean modules;make modules_install install 來產生新的 kernel, 重新開機 try try 確定沒有問題.

重新進入 kernel-{version}/linux-{version}/ , 將 .config 先行備份 config-default, 執行 make mrproper 做清理的動作, 將 config-default copy 到 .config, 執行 make rpm-pkg . 執行的結果是存在 /usr/src/redhat/RPMS/i386/ 與 SRPMS/ 當中各產生一個 rpm 檔案, 當然是要給它執行確認是否可以用!!
# rpm -ivh --nodeps kernel-{version}.i386.rpm
請務必加入這個 --nodeps 參數, 否則會出現 error:
error: Failed dependencies:
kernel >= 2.6.10 conflicts with lksctp-tools-1.0.2-6.4E.1.i386

** 經由 2.6 kernel compiler 之後的 modules , 眼尖的人可能發現到, 怎麼每個 .ko 檔都變肥了 ? 我也是因為這個原因找了很多網站, 一次想說放棄的心情下, 無意中找到這個網站, 內容直接說明一個指令 strip , 經由這個網站的大大說明, 請不要直接使用 strip 下去跑, 因為沒帶參數的這個指令, 是個殺傷力極大的...; 後來我從 [Linux 指令參考手冊-O'Reilly] 當中, 找到了關於這個指令的描述: 從目的檔 files 中, 將符號移除。哇! 的確很強, 如果不帶參數, module 裡面所有的符號統統被刪除, 那還能用嗎 ?!! 所以, 我決定採用那位網站的大大所說: strip -g -s -d *.ko 照此方式操作, 結果很好, 另外, 我又將它給發揚光大, 把 strip 跟 find 結合, 哈哈...就可以修改所有的 .ko 囉.

方法如下:
strip -v -x(or -g -S -d) `find kernel/ -name *.ko`


希望以後會有更加便利的方式, 讓整合資源簡單化, 這樣 Linux 就會越來越普及。

2008年9月19日 星期五

製作無人值守的windowsXP超級封裝光碟

作者. Baron. Wan

需要資料:
1. easyboot [製作開機光碟工具]
2. windowsXP CD片 [ 解開 support/tools/deploy.cab ]
3. ultraISO [ 修改 .iso & .ima 開機的image 內容 ]
4. nero [ 製作可開機 dvd 光碟用途 ]
5. ghost 11版 for dos (ghost.exe)
6. dos 的 光碟驅動
7. 需有一些些 dos 能力

開始製作:
1. 解開 easyboot (以下內容只做為教學用途,若有需相關軟體,期望能考慮其合法性.) , 在 disk1/ezboot/ 底下有個 setup98.img (這是win98 開機boot image檔), 為何需要這個, 因為我在製作整個過程, 為了達到無人值守的要求, 曾經嘗試許多的網路上提供的方式, 用來用去都不是太符合自己的要求. 要做到無人值守, 在ghost 還原後立即重新開機, 系統能依時間內未按任何按鍵而採用預設由硬碟啟動的方式來達成此一目標. 不過, 這個檔案內容有些東西要更換一下,來符合自己的需求, 嘿嘿 ~
2. 首先, 先行編寫 config.sys 跟 autoexec.bat 這兩個檔, 以下是我的範本:
======== config.sys =========
[MENU]
MENUITEM=FDISK,SPFDISK
MENUITEM=MG,Use USB drive and Manual GHOST
MENUITEM=AR,Not use USB drive and Auto fdisk-Auto Recovery
MENUITEM=MPR,Not use USB drive and Not auto fdisk-Auto Recovery
MENUITEM=AB,Auto Backup
MENUDEFAULT=FDISK,30
MENUCOLOR=15,0

[COMMON]
DEVICE=HIMEM.SYS
DOS=HIGH,UMB
BREAK=OFF
NUMLOCK=ON
FILES=32
BUFFERS=64,4
LASTDRIVE=Z
SHELL=COMMAND.COM /P /E:1024
DEVICE=DRIVER\NEC_IDE.SYS /D:NECIDE
DEVICE=DRIVER\MTMCDAI.SYS /D:MTMCDAI
DEVICE=DRIVER\TEAC_CDI.SYS /D:TEAC-CDI
DEVICE=DRIVER\oakcdrom.sys /D:OAKCD001
DEVICE=DRIVER\gcdrom.sys /D:MSCD000 /C0
DEVICE=DRIVER\gcdrom.sys /D:MSCD001 /C1
DEVICE=DRIVER\gcdrom.sys /D:MSCD002 /C2

[FDISK]

[MG]
DEVICE=DRIVER\DUSE.EXE VERBOSE CDDEVICE=USBCDROM

[AR]

[AB]

[MPR]

======== autoexec.bat ========
@echo off
LH DRIVER\MSCDEX.EXE /D:MTMCDAI /D:OAKCD001 /D:TEAC-CDI /D:NECIDE /D:MSCD000 /D:MSCD001 /D:MSCD002 /L:O

goto %config%

:FDISK
O:\
spfdisk.exe
goto exit

:MG
LH DRIVER\MSCDEX.EXE /D:USBCDROM /L:U
SMARTDRV.EXE
O:\
ghost.exe
goto exit

:AR
SMARTDRV.EXE
O:\
auto.bat
goto exit

:AB
SMARTDRV.EXE
O:\
backup.bat
goto exit

:MPR
SMARTDRV.EXE
O:\
noauto.bat
goto exit

:exit
@echo on

===========================================
上述針對 .bat 的內容

******** auto.bat ********
ghost.exe -CLONE,mode=PLOAD,src=O:\system.gho:1,dst=1:1,sze1=90P,sze2=10P -SURE -NTD -FX -RB

******** noauto.bat ********
ghost.exe -CLONE,mode=PLOAD,src=O:\system.gho:1,dst=1:1 -SURE -NTD -FX -RB

******** backup.bat ********
ghost -CLONE,mode=PDUMP,src=1:1,dst=1:2\system.gho -SPLIT=650 -Z5 -NTD -SURE -FX -RB

以上. 都設定完畢了之後, 接下來最費工的地方, 就是來去找 driver, 網路上有提供下載的位置, 由於當初沒抄, 反正只要搜尋一下, 花點時間就能找到了, 然後將之集合起來...
以下 setup98.img 內容, 是我已經變更後的資料:

******* setup98.img ********
aspicd.sys
autoexec.bat
btdosm.sys
choice.com
command.com
config.sys
drvspace.bin
findcd.exe
flashpt.sys
format.com
himem.sys
io.sys
jo.sys <-- 這個,在io.sys 會載入, 就是可以由硬碟啟動的東東
mem.exe
msdos.sys
smartdrv.exe
driver\
driver\DUSE.exe
driver\duseldr.com
driver\mtmcdai.386
driver\mtmcdai.sys
driver\nec_ide.sys
driver\oakcdrom.sys
driver\teac_cdi.sys
*********************************

3. 上述處理好之後, 可先利用 UltraISO 將這個 image 檔寫在軟碟上, 啟動try一下是否 ok?
確定沒問題之後, 請先參考(4) 步驟的燒錄內容, 唯獨目前為止, 因為尚未製作 .gh* 的檔案. 製作出第一張的開機光碟, 接下來, 以下是很重要的...

封裝 windows 系統前, 我習慣會先將不用的, 多餘的, 先行清除, 然後做磁碟重組完畢之後, 再開始做封裝動作, 系統越是乾淨越好 !

習慣上, 我會把 DEPLOY 這個 folder MOVE 到 D:\ .
先執行 setupmgr.exe , 然後選擇以 sysprep 的方式製作, 選擇全自動安裝的過程, 依序輸入相關在安裝時會需要輸入的資訊, 包含註冊碼..等資訊, 最後讓它在C:\DEPLOY 產生 sysprep.inf 檔; 接下來執行 sysprep.exe , 不知道是不是因為我的是 winxp sp2 版本的關係, 我執行該程式反應出來的內容, 怎麼跟網路上說明好像不太一樣 ?!!

是這樣的, 我勾選了 [不重設啟用的限定期限],[使用迷你安裝],[偵測非隨插即用的硬體]這三項.記住!! [不重新產生安全性識別元] 不能勾選, 否則製作出來的封裝, 只能在原來的機器上運作. 封裝完畢後, 就用那片剛完成的開機光碟, 開機選擇 [Auto backup], 然後它就會自動將 C:\ 製作 image 到 D:\

4. 最後一步, 就是回到 windows, 當然由於剛剛封裝完畢, 所以當進入 windows 時, 它會自動解封裝, 順便看看解封裝的過程有沒有問題吧 !!

解完封裝後, 進入 windowsXP 系統, 安裝 nero, 然後選擇 DVD-ROM (boot) , 就是要製作 DVD版的開機光碟, 然後選擇開機的 image 檔, 這個檔案當然就是 setup98.img 囉, 然後選擇[新建], 之後在主畫面, 將 spfdisk.exe , ghost.exe , auto.bat , noauto.bat , backup.bat 放入, 然後將 system.gh* 放入, 最後, 當然就是再把它燒錄起來.

2008年9月3日 星期三

Linux 速記~

作者: Baron. Wan



YUM 使用 proxy 進行連線

於 .repo 檔中添加:
        proxy=http://proxy_ip:port


建立 swap 檔案

# dd if=/dev/zero of=<路徑+檔名> bs=1024 count=<容量 kb>

ex: dd if=/dev/zero of=/swapfile bs=1M count=1024
bs=1M count=1024 (總共為 1GB)

# mkswap -c <上述產生的swap 檔案路徑檔名>
ex: mkswap -c /swapfile

# swapon /swapfile

查看記憶體
# free

Linux nbtstat 功能
# nmblookup

系統負載狀況
# vmstat

系統時間變更
# date MMDDhhmmYYYY

系統時間寫入硬體
# hwclock --systohc

將本機的檔案COPY到遠端的主機 (SMB)
smbclient //192.168.0.1/share -U username%password -c "lcd /var/backup; put backup-99999.tar.gz"
遠端命令:
lcd 指定本機端路徑
cd 變更遠端路徑
put 將本機端的檔案COPY到遠端當前的路徑下
get 將遠端目前位置的檔案COPY到本機當前路徑
!ls 列出本機的檔案
ls 列出遠端的檔案

重新編譯原碼
rpm -ivh .src.rpm
會在家目錄產生 ~/rpmbuild/{SOURCE,SPECS}
1. 進入 SOURCE/ 解壓縮該原碼 ( .tar.gz | .tar.bz2 ), 然後進入該目錄修改自己需要的.
2. 重新壓回原格式.
3. 進入 SPECS/ 中, 執行該 .specs : rpmbuild -ba .specs
4. 將產生的 .rpm (~/rpmbuild/RPMS/(i386|i686|noarch)) 放到 /myrpm/apps/2011/i386/packages
5. 將新的 .src.rpm (~/rpmbuild/SRPMS/) 放到 /myrpm/apps/2011/srpm
6. 進入 /myrpm/apps/2011/i386/ 處, 執行 : createrepo --update ./
    這段執行會在底下的 repodata/ 處產生 packages/ 關聯的 xml 檔.
之後我們就可經由 yum 來 install 它了. (當然前提須要先架設自己的 yum server)

grep 一次查詢多個不一樣的關鍵字
rpm -qa |grep -P '{|faad2-libs|gstream-ffmpeg|libdc1394|dirac-libs|gsm|lame-libs|x264-libs|}'

尋找多檔案中的關鍵字
find . -type f -print | xargs grep "關鍵字"


sed指令 ~ 覆寫修改檔案內容
sed -i "/尋找字串/s/原字串/修改為字串/g要進行修改的檔案
ex: sed -i "/ROOTDIR/s/^/#/g" /etc/sysconfig/named


sed指令 ~ 單行多條件 ~ 刪除後插入
sed -e "/HWADDR=/,1d;2i HWADDR=\"00:00:00:00:00:00\"" -i ifcfg-eth0
-e : 單行多條件
1d : 刪除條件中的單行
2i : 隨後插入 後面的字串

sed指令 ~ 搜尋字串並暫存, 再取出並銜接後面字串內容
cat known_hosts| sed -e "s/\([[:lower:]]\)\:\ /\1.test\,192\.168\.1\.1 /g"
[註] 用 '(' and ')' 標示起來的會被暫存, 用 \1 可取出第一筆資料
再例:
cat known_hosts|  sed -e "s/\([[:lower:]]\)\([0-9]\)\:\ /\1\2\,192\.168\.1\.\2 /g"
[註] 有兩個 '(' and ')' , 則 \1 取第一筆, \2 取第二筆

ssh 只限於允許的成員登入作法, 在 pam.d 中的 sshd 內添加
auth       required     pam_stack.so service=system-auth
auth       required     /lib/security/pam_listfile.so item=user sense=allow file=/etc/ssh/user_allowlist onerr=succeed 
account    required     pam_nologin.so


cpio 快速說明
cpio -idv (解壓縮)
cpio -oH crc (CRC檢查後壓縮)

一般除了使用 cp -arp 方式複製,也可使用 cpio:(於要複製的當前目錄中進行)
find . | cpio -pmd   /要複製到何處 ? (目的端)

depmod 建立kernel 相關模組的相依性
# depmod -a (all)
# depmod -a 2.6.32-131.0.15.el6.i686 (針對此 kernel 版本)
# depmod -a -b /root/test/ (預設是 /lib/modules 路徑, 此將變更到 /root/test/ 去尋找當前 kernel 版本的目錄)

設定 Partition 可 Boot 區域
/sbin/parted  <裝置>
ex: /sbin/parted /dev/sdg

(parted) toggle N boot
N 代表第幾個 Partition 設為 Boot,此例中為 sdg1
ex: toggle 1 boot

然後 quit 離開即可。

[以下內容原出處已遺忘...]
========================================================

[系統管理]釋放掉Linux記憶體(Cache)

在此都以Cent OS 5.3為例,
有些人可能會利用free指令發現,
記憶體怎麼一直被吃掉…
但用top指令也查不出是哪個程式
這時候在free指令的時候仔細看
絕大部分都是被放到Cache跟Buffer去了,
Cache的作用是讓常用的文件暫存在記憶體裡面,減少IO次數提升效率
而Buffer則是減緩文件正式寫入硬碟的時間,
在Web Server上會很明顯的一點就是Cache大量消耗,
這有助於提升整體Web Server的效率沒錯,
所以在RAM Size還允許的情況下,不太建議清除記憶體
但若有程式不能完全釋放記憶體的情況下,
仍想清除Cache的時候該如何呢
可以用以下指令
echo 1 > /proc/sys/vm/drop_caches
建議用1即可,用2可以從dentries、inodes中壓出更多的空間.
echo 2 > /proc/sys/vm/drop_caches
但3就不建議了,容易造成系統錯誤.
記得釋放完,要再下
echo 0 > /proc/sys/vm/drop_caches
指令.來回復預設狀況喔!~

--------------------------------------------------------------------------------------------------------------
Linux 系統光碟安裝,從 USB隨身碟外掛 ks.cfg:

   1. 於安裝選單中 (install manu),按 鍵,於輸入列尾端附加:

       ip=dhcp  ks=hd:sda1:/your_path/ks.cfg


   2. 安裝完畢,光碟不要急著拔出,因為在安裝時,usbdisk 被系統認為是 sda,因此當系統寫mbr 資訊到硬碟時,是以 sdb(hd1) 來寫入,所以在第一次 reboot後,要進入救援模式,chroot 進入 /mnt/sysimage 後,重新執行 grub-install /dev/sda,來讓 system boot 的位置重新設定。但是,在進行 grub-install 前,請記得變更 /boot/grub/grub.conf 中相關 (hd1) 變更為 (hd0) 。當然最好的辦法:就是直接在 ks.cfg 內容最後 (%post),直接添加 "修改 grub.conf " 的內容。

example:

--------------------------------------------------------------------------

%post --nochroot

mkdir -p /mnt/sysimage/tmp/usbdisk/

mount /dev/sda1 /mnt/sysimage/tmp/usbdisk/

%post

/etc/init.d/network start

rpm --import http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6

rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt

rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6

rpm --import http://packages.atrpms.net/RPM-GPG-KEY.atrpms

rpm -ivh /tmp/usbdisk/cluster/CentOS/6/x86_64/Packages/rpmforge-release-0.5.2-1.el6.rf.x86_64.rpm

rpm -ivh /tmp/usbdisk/cluster/CentOS/6/x86_64/Packages/epel-release-6-8.noarch.rpm

rpm -ivh /tmp/usbdisk/cluster/CentOS/6/x86_64/Packages/atrpms-repo-6-6.el6.x86_64.rpm

...

sed "/^[[:space:]]root/s/hd1/hd0/g; /^splashimage/s/hd1/hd0/g" -i /boot/grub/grub.conf

...

# 這是可開機自動 login 的設定 (給自己註記~)

sed "/^exec.*mingetty/s/$/ --autologin root root_password/" -i /etc/init/tty.conf

...

...

/sbin/grub-install /dev/sdb

%post --nochroot

umount /mnt/sysimage/tmp/usbdisk/

-------------------------------------------------------------------------


[註] ip 參數是當 ks.cfg 內容中需要進行網路部署時需要。

**************************************************************

Linux 系統安裝光碟,從遠端主機外掛 ks.cfg:

      於安裝選單中 (install manu),按鍵,於輸入列尾端附加:

       ip=dhcp  ks={http://|ftp://|nfs://...}/remote_path/ks.cfg


 

2008年8月18日 星期一

加入 driver 到 Linux Install CD ~

作者: Baron. Wan


如何將新的 Driver 擺到 Linux 安裝光碟裡, 沒錯, 就是這個囉. 以下就是跟大家分享的內容啦!

在 Linux Install CD 內的 isolinux folder 中, 找到一個名叫 initrd.img 檔案,
# file initrd.img
(initrd.img: gzip compressed data, from Unix, last modified: Tue Nov 20 00:11:12 2007, max compression) 它目前是採用 gzip 壓縮方式.
所以我們必須先將 initrd.img 解壓縮.
# mv initrd.img initrd.img.gz
# gunzip initrd.img.gz
之後再用 file 指令查看目前 initrd.img 屬性為何?
# file initrd.img
(initrd.img: Linux rev 1.0 ext2 filesystem data) 它現在的格式為 ext2 filesystem data
所以我們可以直接 mount 它, 開始感到興奮了吧 !!
# mount -o loop initrd.img /mnt/
上例中, 我將它 mount 到 /mnt 目錄裡.
我們到 /mnt 內看看, 呵呵, 它真的就是我們在 Install 時的安裝環境內容:
bin dev etc linuxrc lost+found modules proc sbin selinux sys tmp var

以上的環境我都是在 CentOS 4 的環境下 try 的, 是不是其他環境也一樣我就沒去考究了, 哈.
有沒有看到 modules 這個 folder ? 進去裡面看看吧... 怎樣, 是不是跟 /lib/modules/`uname -r` 的內容非常像 ?! 根本就是一樣嘛. 到這裡許多有些 Linux 基礎的應該可以想到要如何實做它了. 或許你有這個疑問 ? 怎麼看不到有 .ko 的 module 檔案呢 ? ....

注意這個 folder 裡有個 modules.cgz , 這個檔名怎麼看起來怪怪的, 好像是用 gzip 壓縮的, 沒錯, 它真的是, 嘿嘿.
# file modules.cgz
(modules.cgz: gzip compressed data, from Unix, last modified: Tue Nov 20 00:11:03 2007, max compression)
沒錯吧. 方法一樣...
# mv modules.cgz modules.cgz.gz
# gunzip modules.cgz.gz

現在, 我們再用 file 查詢一下目前這個檔案是甚麼屬性 ?
# file modules.cgz
modules.cgz: ASCII cpio archive (SVR4 with CRC)
OH~ cpio 原來它用 cpio 封裝的.

cpio 指令我是不太熟, 如果有熟悉它這個指令的, 也可以發表一下, 至於我, 是用網站上東拼西湊 ....我不得不說這個指令還真是感到奇怪, 或許是我沒用習慣吧 !
# cpio -idv 接下來把這個 modules.cgz 解壓出來之後, 裡面就是存放 .ko 的 module 檔囉.

上述的指令, 我在 Linux driver to disk 的網站上看到了一個方法:
zcat modules.cgz |cpio -idm
這個方式可以將 modules.cgz 直接解開, 很是方便.

http://hon0612.blogspot.com/2007/09/linuxdriver-disk.html
在上面這個網址, 所發表的內容當中, 讓我對 modules/ 內的那五個檔案, 終於知道是在做啥, 同時也知道應該要怎麼將 driver 正確的加諸到這幾個檔案內容當中:
有興趣的讀者可以到上面的這個網站來去研究一番.

PS. 有時候我會擔心這個網站的資料無故被刪除或消失了?! OH~ 上天知道我是多麼渴望留著這些重要資料, 所以有些時候會將重要的資訊 copy 一份到我這裡, 呵呵~ 以後要查才查的到 ^^*

2008年8月6日 星期三

身陷 JavaScript 的迷瘴

撰文者: PJ. Wan

由於我們公司的 spam mail filter system 在 firefox 使用, 才發現原來當初撰寫許多的語法都只適用在 IE中, 而我又偏偏愛用 Linux (連我公司家裏的電腦都只有Linux系統), 所以狠下心來研究如何將 裡面的 JavaScript 改寫為 firefox 適用. 以下是查看多個網站, 再加上自己實際上得測試, 獲得的一些心得.

document.all 網站上都會說這個語法在 firefox 不受支援, 但或許我用的是 firefox 3版, 我發現並非所有的 document.all 都不能執行, 有些還是需要保留, 像是:
document.all.showDataForm.submit();

當 然, 許多網站上也說明最好是用 document.getElementById 來取代 document.all; document.all 是微軟提供給程式設計者, 針對 IE 的一個好用的函式, 而 document.getElementById 則是符合 W3C 的規格, 這個函式可以看成 get-Element-By-Id , 也就是取得 ID 值; 修改的方式是, 比如: document.all.iPage.value , 對 document.all 來說, iPage 是一個 Name or Id ,iPage.value 就是 iPage 這個 Name or Id 的值.,如果要改為 getElementById , 則必須將 iPage 這個 Id Name 包在裡面, 形成這樣: document.getElementById("iPage").value , 以此類推.

另外, document.all.length 看網站上是說它在 firefox 不受支援, 就在查了許多的網站, 猶如在黑暗中看到一絲光線般的, 終於看到了解決方案 ; getElementsByTagName ; 另外, window.frames("framesname") 則必須改為 window.frames["framesname"] 才能在 firefox 使用, 好, 回到上述 document.all.length 解決方式, 先用 var 產生一個具有 getElementsByTagName('Tag-Name') 的變數, 由於我碰到的狀況是連同 window.frames[] 這個函式, 而我解決的方式是:
var UC = window.frames["FramesName"].document.getElementsByTagName('*');
爾後在程式中可以如下使用:
UC[i].id.indexOF(...)

這樣就可以了.
---------------------------------------------
關於 window.close();
---------------------------------------------

在 Mozilla 底下是正常的
不過如果這個動作必須在最上層的 window 發出
在底層的 frame 會沒有作用

試試 top.window.close();

2008年7月17日 星期四

rpm 札記

顯示套件異動的日誌資訊
rpm -q --changelog

顯示套件資訊
rpm -qi

尋找有哪些套件需要此套件(相依性)
rpm -q --whatrequires

列出套件提供的功能
rpm -q --provides

列出套件所含的組態檔
rpm -qc


指定只秀出 rpm 套件名稱列表
rpm -qa --queryformat="%{NAME}\n"|sort -n


Show rpm package name and arch
rpm -qa --qf "%{n}-%{arch}\n"


秀出所有可用的rpm Tag <標籤>
rpm --querytags

若要於安裝時,可指定安裝路徑,需在 specs 檔中添加 prefix 的標籤
SPECS:
    prefix: opt/tmp

INSTALL:
    rpm -qp --queryformat "%{prerfixes}\n" my.rpm
    > opt/tmp
    rpm -ivh --prefix=/tmp my.rpm
    將在 /tmp 路徑中安裝此套件。

解 rpm 包
rpm2cpio rpmfile.rpm  | cpio -idv

詳列製作 RPM 包的變數及其內容
/usr/lib/rpm/macros

rpm 解譯 執行動作代碼
$1 = 1 (install; rpm -i)     if [ $1 -eq 1 ]; then ... fi
$1 = 0 (erase; rpm -e)
$1 = 2 (update; rpm -U)

rpm update (rpm -U) 流程順序如下
(example: A.rpm want to UPDATE to B.rpm)
        1.   B.rpm 執行  --
                %post
        2.   A.rpm 執行 --
                %preun
                %postun

其他詳細 RPM 說明可參考: [http://linux.vbird.org/linux_basic/0520rpm_and_srpm.php#rpmmanager]




2008年5月27日 星期二

ubuntu 的好~

如果要下command變更為root權限, 可以使用 'sudo su - ' 來完成喔. 預設root是沒有密碼, 看網路上說明這是一些安全性的防範措施. 不過有些人覺得麻煩, 我倒是認為無關緊要就是 ^^, 還蠻好用的, 其實我一直想把 linux 用得很 friendly, 然後給一些少接觸電腦的使用者來嘗試, 當然遊戲一直是linux不足的地方, 但是如果其他文書或是影音娛樂方面, 我認為也不會輸給 Microsoft. 只要你習慣於他的環境, 知道要去哪裡找到相關的應用程式來使用, 不太介意遊戲的部份, 他絕對比 M 牌的好用, 你不用擔心系統會當機, 一天到晚不是中毒就是被駭, 然後為了預防又裝了專吃系統資源的防毒軟體, 最後又覺得怎麼系統越來越慢, 效能越來越差!! 只要你是一個敢勇於嘗試, 它( linux)不會讓你失望 ^^.

2008年5月24日 星期六

ubuntu 真的不一樣 ~

它真的跟我習慣於 RedHat 系統不一樣, 可以明顯感受到的, 是它在 Desktop 的努力. 相當的 friendly, 跟網路上說的一樣, 真的跟 windows 有得尬, 哈 ~ 而且整體上蠻順暢的, 看來離取代 windows 的時間越來越近了. 另外, 對於 windows 下的 .exe 或是 .com 等等的執行程式是不能用的喔. 如果要用還需要給它安裝 xen or vmware 類似的東東才行; 但是針對 windows 下, 許多的應用程式, 它有相對應可使用的套件, 而且幾乎都已經安裝在上面了, 而且也可以對所有的套件做線上的 Update. 當然前提要能夠上 Internet.

如果你有看到網路上許多人將安裝好之後的 ubuntu 做動態展示, 你也會跟我一樣, 對它懷抱著一些希望喔 ^^. Linux 加油!

初遇 ubuntu ~

在看到網路上許多人的介紹, Linux系列中, 有個很棒的桌面系統可以用 -- ubuntu; 止不住內心的激動, 遂去 ubuntu 官網上去 download 8.04 desktop 的中文版本....終於下載好了, 趕緊給他燒錄起來安裝, 無奈...怎麼會出現 I/O error !!! 恩...可能是燒錄不成功, 沒關係, 現在空白片便宜, 再燒一次....什麼 ??? 一樣的問題..... 不會是我的光碟機出問題了吧....= =, 沒關係有其他台可以測試 ... What ?? 一樣的結果, ㄚ這是怎樣, 裝過不算少的 Linux System, 怎麼就敗在這裡...不可能吧!!! 趕緊去網路上扒文,恩...先下載 MD5SUM 來給他確認一下版本內容有沒有問題.

經過MD5SUM確認後, 內容版本無誤, 那是什麼問題 ? 難道.....是我的硬體壓根就不支援...不是吧?! 一台是 ASUS P4P800 SE 主機板, 一台是 HP 主機耶..., 真的不相信, 再去網路上給他看個清楚....喔!! 難道在燒錄的時候要選最低倍數燒 ?!! 現在還有這種東西存在世上喔 ?? 好吧, 姑且給他相信一下 ^^, 燒錄完畢還習慣的看一下碟片的光面, 疑?!...怎麼容量不太一樣? 這次燒錄出來的片子竟然是 "滿版". 看來這次有機會可以成功囉!! ^---^

Oh! Ya~~ 真的可以了耶, 剛看到它還真是給他感動, 果然, 多看看網路上大大們的經驗談是有用地, 呵呵 ~~