狼愛上貍

          我胡漢三又回來了

          #

          solaris配置文件

          出 處:http://cyberli.blog.com/1064961/


          /etc/cron.d/cron.allow
          /etc/cron.d/cron.deny? ? ? ? 用于對crontab進行訪問控制.? ? ? ?
          /etc/defaultdomain? ? ? ? ? ? ? ? NIS域名設置文件
          /etc/default/cron? ? ? ? ? ? ? ? 對cron的log進行控制.
          /etc/default/login? ? ? ? ? ? ? ? 對root用戶遠程登陸許可進行設置。
          /etc./default/su? ? ? ? ? ? ? ? SULOG及SYSLOG值可以控制su的日志,還有可以對其su后
          ? ? ? ? ? ? ? ? ? ? ? ? 環境變量進行設置。
          /etc/dfs/dfstab? ? ? ? ? ? ? ? NFS共享的配置文件
          /etc/dfs/sharetab? ? ? ? ? ? ? ?
          /etc/group? ? ? ? ? ? ? ? 用戶組配置文件。
          /etc/hostname.interface? ? ? ? 網絡接口名稱文件,其IP在/etc/inet/hosts文件中設置。
          /etc/hosts.allow
          /etc/hosts.deny? ? ? ? ? ? ? ? 主機遠程訪問控制文件。

          /etc/hosts.equiv? ? ? ? ? ? ? ? r系列命令訪問控制文件。
          /etc/inittab? ? ? ? ? ? ? ? init啟動進程所需要的腳本文件,用于控制不同的啟動級別。
          /etc/logindevperm? ? ? ? ? ? ? ? ttymon的配置文件主要用來控制設備的訪問權限。
          /etc/magic? ? ? ? ? ? ? ? file命令所顯示的文件類型數據庫
          /etc/mail/aliases
          /etc/aliases? ? ? ? ? ? ? ? sendmail的郵件別名文件

          /etc/mail/sendmail.cf
          /etc/sendmail.cf? ? ? ? ? ? ? ? sendmail的控制文件
          /etc/minor_perm? ? ? ? ? ? ? ? 使用drvconfig命令所許可的設備。
          /etc/mnttab? ? ? ? ? ? ? ? 當前系統中已mount的所有資源
          /etc/name_to_major? ? ? ? 當前配置的主設備號,被用于drvconfig命令
          /etc/netconfig? ? ? ? ? ? ? ? 網絡配置數據庫,用于網絡初始化。
          /etc/netgroup? ? ? ? ? ? ? ? 定義主機和用戶組。
          /etc/netmasks? ? ? ? ? ? ? ? 定義默認子網掩碼。
          /etc/nsswitch.conf? ? ? ? ? ? ? ? 域名查找順序配置文件。
          /etc/path_to_inst? ? ? ? ? ? ? ? 用于配置物理設備樹、物理設備名和實例名文件。
          /etc/protocols? ? ? ? ? ? ? ? 協議配置文件
          /etc/remote? ? ? ? ? ? ? ? tip命令的屬性文件。
          /etc/rmtab? ? ? ? ? ? ? ? 當前已mount的遠程文件系統文件列表。
          /etc/services? ? ? ? ? ? ? ? 網絡端口號列表文件。
          /etc/syslog.conf? ? ? ? ? ? ? ? syslogd 配置文件。
          /etc/system? ? ? ? ? ? ? ? 內核配置文件。
          /etc/vfstab? ? ? ? ? ? ? ? 關于本地及遠程文件系統自動mount列表。
          /var/adm/messages? ? ? ? ? ? ? ? 主日志記錄文件。
          /var/adm/sulog? ? ? ? ? ? ? ? 默認的su命令記錄文件。
          /var/adm/utmpx? ? ? ? ? ? ? ? 用戶和賬號信息文件。
          /var/adm/wtmpx? ? ? ? ? ? ? ? 用戶登陸的賬號信息文件。

          /var/local/etc/ftpaccess
          /var/local/etc/ftpconversions
          /var/local/etc/ftpusers? ? ? ? wu-ftpd 的配置文件。
          /var/lp/log? ? ? ? ? ? ? ? 打印服務日志文件。
          /var/sadm/install/contents? ? ? ? 軟件包安裝數據庫文件
          /var/saf/_log? ? ? ? ? ? ? ? SAF的日志文件。

          posted @ 2006-11-05 17:15 狼愛上貍 閱讀(382) | 評論 (0)編輯 收藏

          配置安全的solaris

          出處:http://www.xxlinux.com/linux/article/unix/rumen/2006-06-25/2116.html

          一、帳號和口令安全策略
          ?
          1.1更改口令文件、影像文件、組文件的權限?
          ????/etc/passwd?必須所有用戶都可讀,root用戶可寫?–rw-r—r—?
          ????/etc/shadow?只有root可讀?–r--------?
          ????/etc/group?必須所有用戶都可讀,root用戶可寫?–rw-r—r—?

          1.2修改不必要的系統帳號?
          ? ???移去或者鎖定那些系統帳號,比如sys、uucp、nuucp、listen、lp、adm等等,簡單的辦法是在 /etc/shadow的password域中放上NP字符。還可以考慮將/etc/passwd文件中的shell域設置成 /bin/false?

          1.3修改口令策略?
          ????修改/etc/default/passwd文件?
          ????MAXWEEKS=4?口令至少每隔4星期更改一次?
          ????MINWEEKS=1?口令至多每隔1星期更改一次?
          ????WARNWEEKS=3?修改口令后第三個星期會收到快要修改口令的信息?PASSLENGTH=6?用戶口令長度不少于6個字符

          二、用戶授權安全策略?
          2.1移去組及其它用戶對/etc的寫權限。?
          ????執行命令#chmod?-R?go-w?/etc?

          2.2禁止root遠程登錄?
          ????在/etc/default/login中設置?
          ????CONSOLE=/dev/concle?

          2.3setuid和setgid特殊權限。?
          ????Setuid 是指設置程序的有效執行用戶身份(uid)為該文件的屬主,而不是調用該程序進程的用戶身份。Setgid與之類似。Setuid和setgid用1s? -1顯示出來為s權限,存在于主人和屬組的執行權限的位置上。系統設置特殊權限,使用戶執行某些命令時,具有root的執行權限,?命令執行完成, ?root身份也隨之消失。因此特殊權限關系系統的安全,可執行命令#find?/?-perm?-4000?-print?尋找系統中具有setuid 權限的文件,存為列表文件,定時檢查有沒有這之外的文件被設置了setuid權限。?

          2.4審計并日志所有以root身份的登陸情況?
          ????添加或編輯/etc/default/login文件如下:?
          ????SYSLOG=?YES?
          ????syslog記錄root的登陸失敗,成功的情況。?

          2.5設置遠程登陸會話超時時間?
          ????添加或編輯/etc/default/login文件如下:?
          ????TIMEOUT=?300?

          2.6確定登陸需要密碼驗證?
          ????添加或編輯/etc/default/login文件如下:?
          ????PASSREQ=?YES?

          2.7?UMASK設置?
          ? ???umask命令設置用戶文件和目錄的文件創建缺省屏蔽值,若將此命令放入.profile文件,就可控制該用戶后續所建文件的存取許可.umask命令與chmod命令的作用正好相反,它告訴系統在創建文件時不給予什么存取許可.?
          ????安裝配置完操作系統之后確認root的umask設置是077或者027,執行?
          ????/usr/bin/umask?[-S]?確認。?


          2.7.1增加或修改/etc/default/login文件中如下行?
          ????UMASK=027?

          2.7.2并增加上行到如下的文件中:?
          ????/etc/.login?/etc/.profile?/etc/skel/local.cshre?
          ????/etc/skel/local.login?/etc/skel/local.profile?

          2.8用戶環境配置文件的PATH或者LD_LIBRARY_PATH中移去“.”?。?
          ? ???從如下的文件中移走”.”,確認root的PATH環境變量設置是安全的,應該只包含/usr/bin: /sbin:/usr/sbin,避免當前工作目錄.出現在PATH環境變量中,這有助于對抗特洛伊木馬。?
          ????#echo?$PATH?|?grep?":."?確認?

          ????/.login?/etc/.login?   ?/etc/default/login? ?
          ????/.cshrc?/etc/skel/local.profile?/etc/skel/local.cshrc?
          ????/.profile /etc/skel/local.login?/etc/profile

          三、網絡與服務安全策略?
          3.1關閉不用的服務?
          3.1.1在inetd.conf中關閉不用的服務?
          ???? 首先復制/etc/inet/inetd.conf。 ?#cp?/etc/inet/inetd.conf?/etc/inet/inetd.conf.backup然后用vi編輯器編輯 inetd.conf文件,對于需要注釋掉的服務在相應行開頭標記“#”字符即可。?

          3.1.2在Services中關閉不用的服務?
          ????首先復制/etc/inet/services。?#cp?/etc/inet/services?/etc/inet/services.backup?
          然后用vi編輯器編輯Services文件,對于需要注釋掉的服務在相應行開頭標記“#”字符即可。?
          在inetd.conf、services中進行修改后,找到inetd進程的ID號,用kill向其發送HUP信號進行刷新。舉例如下。?
          ????#ps?-ef?|?grep?inetd?
          ????#kill?-HUP?進程號?或/usr/sbin/inetd?–s?–t?
          ????增加-t選項以加強網絡訪問控制?

          3.1.3根據需要關閉不用的服務?
          ? ???可關閉如下服務:tftp、ypupdate(NIS程序)、?dtspcd(郵件收發程序) ?、rquotad、name、uucp(網絡實用系統)、snmp(簡單網絡管理協議)等。?

          3.2關閉系統的自啟動服務?
          ????在系統/etc/rc*.d的目錄下,根據需要停用以下服務:?
          ????sendmail?把/etc/rc2.d/S88sendmai更名為tc/rc2.d/X88sendmail?
          ????DNS?將/etc/rc2.d/S72inetsv注釋掉in.named一項?
          ????lp?把/etc/rc2.d/S80lp更名為?/etc/rc2.d/X80lp?
          ????uucp?把/etc/rc2.d/S70uucp更名為/etc/rc2.d/x70uucp?
          ? ???snmp把/etc/rc3.d/S76snmpdx和? /etc/rc3.d/S77dmi?更名?為/etc/rc3.d/s76snmpdx和 /etc/rc3.d/s77dmi?
          ????autoinstall?把/etc/rc2.d/S72autoinstallg更名為/etc/rc2.d/s72autoinstall?

          3.3加強FTP服務安全?
          3.3.1禁止系統用戶的FTP服務?
          ????把所有的系統賬戶加入到/etc/ftpusers(solaris?9的該文件現更改為/etc/ftpd/ftpusers)文件:?
          ????root?、daemon、sys、bin、adm、lp、uucp、nuucp、listen、nobody?

          3.3.2禁止FTP&服務暴露系統敏感信息?
          ? ???編輯/etc/default/ftpd文件,假如文件不存在就新建一個,在文件中的加進入下一項:? ???BANNER=XXXX(XXXX可以任意改變為任何一個版本信息),將該系統版本信息屏蔽.?

          3.3.3ftp服務會話日志記錄?
          ????/etc/inet/inetd.conf中的ftpd為(記錄)?
          ????ftp?stream?tcp?nowait?root?/usr/sbin/in.ftpd?in.ftpd?–dl?

          3.4加強Telnet服務安全?
          3.4.1禁止Telnet服務暴露系統敏感信息?
          ? ???防止telnetd?banner泄露信息?,修改/etc/default/telnetd 文件?,加入以下一項:BANNER=XXXX(XXXX可以任意改變為任何一個版本信息),將該系統版本信息屏蔽.?

          3.4.2更改Telnet服務端口號?
          ????修改文件/etc/services的Telnet一項,將端口號改為非23,使用Telnet服務時需注明端口號。?

          3.5加強NFS服務安全?
          ????檢查/etc/dfs/dfstab文件share語句,缺省時共享目錄為可讀可寫,加入“-o”選項增加安全,“-o?rw”可讀可寫,“-o?ro”只讀,可授權某系統和某用戶。?

          3.6防止TCP序列號預測攻擊(ip欺騙)?
          ????在/etc/default/inetinit中增加設置來防止TCP序列號預測攻擊(ip欺騙)TCP_STRONG_ISS=2?

          3.7系統路由安全?
          ???? 如果Solaris機器有超過一塊的網卡的話,它將會在不同網卡間轉發數據包,這一行為可以在/etc/init.d/inetinit中得到控制。要在 Solaris?2.4或者更低版本機器下關閉它,可以將ndd?-set?/dev/ip?ip_forwarding?0添加于在inetinit文件未尾。在Solaris?2.5以上,只要touch?/etc/notrouter.網絡系統用靜態路由比較安全。?

          3.8調整網絡參數,加強網絡安全?
          ????使IP?forwarding和sourec?routing(源路)由無效?
          ? ???在Inetinit中使IP?forwarding和sourec?routing(源路)由無效(假如有超過一個網絡接口的話)。在/etc/init.d/inetinit中增加下面所示設置:?
          ????禁止系統轉發定向廣播包?
          ????#ndd?-set?/dev/ip?ip_forward_directed_broadcasts?0?
          ????關閉原路由尋址?:#ndd?-set?/dev/ip?ip_forward_src_routed?0?
          ????禁止系統轉發IP包:#ndd?-set?/dev/ip?ip_forwarding?0?
          ????縮短ARP的cache保存時間:?(default?is?5?min)?
          ????#ndd?-set?/dev/arp?arp_cleanup_interval?2?min?
          ????關閉echo廣播來防止ping攻擊(?#?default?is?1?)?
          ????#ndd?-set?/dev/ip?ip_respond_to_echo_broadcast?0

          四、防止堆棧緩沖益出安全策略?
          ???? 入侵者常常使用的一種利用系統漏洞的方式是堆棧溢出,他們在堆棧里巧妙地插入一段代碼,利用它們的溢出來執行,以獲得對系統的某種權限。要讓你的系統在堆棧緩沖溢出攻擊中更不易受侵害,你可以在/etc/system里加上如下語句:set?noexec_user_stack=1?
          set?noexec_user_stack_log?=1?
          ????第一句可以防止在堆棧中執行插入的代碼,第二句則是在入侵者想運行exploit的時候會做記錄。

          五、日志系統安全策略?
          5.1定時檢查系統日志文件?
          ????Solaris 系統通過syslogd進程運行日志系統,配置文件/etc/syslog.conf,可編輯此文件讓日志系統記錄更多信息,需重啟 /usr/sbin/syslogd進程,重讀取配置文件。通常日志系統的文件分別存放在兩個位置,/var/adm保存本地系統日志,/var/log 保存登錄其它系統時日志。
          5.2設置utmpx和wtmpx文件權限,確保日志系統安全。?
          ????文件/var/adm/utmpx記錄了所有當前登錄到系統中的用戶,文件/var/adm/wtmpx記錄了系統所有的登錄和注銷。這兩個文件是以數據庫的格式存在的。
          設置權限#chmod?544?/var/adm/utmpx?
          ????????????#chmod?544?/var/adm/wtmpx

          六、其它系統安全設置?
          6.1?crontab命令?
          6.1.1不要使用crontab?–e命令,因為它會在/tmp下建立所有用戶都可讀的crontab副本訪問cron系統。用如下的方法:?
          編輯文件:mycronfile?
          crontab<mycronfile?

          6.1.2在/etc/default/cron文件中增加如下行:?CRONLOG=YES?記錄所有的crontab行為?

          6.2對su的紀錄?
          ????創建/etc/default/su文件?
          ????SULOG=/var/adm/sulog?
          ????SYSLOG=YES?
          ????CONSOLE=/dev/console?
          ????PATH=/usr/bin:?
          ????SUPATH=/usr/sbin:/usr/bin?

          6.3為OpenBoot設置密碼?
          ????在Solaris中設置密碼?
          ????#eeprom?security-password?
          ????在OpenBoot中設置密碼?
          ????ok?password?
          ????在Solaris中設置安全級別(command)?
          ????#eeprom?security-mode=command?
          ????在OpenBoot中設置安全級別(command)?
          ????ok?setenv?security-mode?command?
          ????在OpenBoot中設置安全級別(full)?
          ????ok?setenv?security-mode?full?

          6.4限制.rhosts和/etc/hosts.equiv文件的使用?
          ???? 配置文件具有兩種功能:r系列命令使用這些文件來訪問系統;在某用戶的目錄下存在.rhosts文件或/etc/hosts.equiv文件配有某系統,任何用戶都可以通過rlogin不需要口令以該用戶的身份登錄到系統。因此要為這些文件加鎖,先創建它們,然后修改其屬性為零即可。這樣除了root用戶就沒有其它用戶能創建或修改它們了。?
          ????/usr/bin/touch   /.rhosts /etc/hosts.equiv?
          ????/usr/bin/chmod 0 /.rhosts /etc/hosts.equiv?
          ????.rhosts文件可以作為一個典型的后門文件使用,運行下面的命令全局查找.rhosts文件?
          #find?-name“.rhosts”-print?

          6.5給系統打補丁?
          ???? 象其它的系統一樣,Solaris系統也有它的漏洞,其中的一些從性質上來說是相當嚴重的。SUN公司長期向客戶提供各種版本的最新補丁,放在http: //sunsolve.sun.com網站。可用#showrev?–p命令檢查系統已打的補丁或到/var/sadm/patch目錄下查已打過的補丁號,用patchadd命令給系統打補丁。?
          七、Setuid設置和Solaris操作系統安全?
          http://bbs.chinaunix.net/forum/viewtopic.php?t=302945&highlight=Setuid?
          ????在Solaris中,文件除了讀、寫、執行權限外,還有一些特殊權限。?Setuid和setgid是其中的一類。它與Solaris系統的安全關系緊密。?
          ? ???Setuid是指設置程序的有效的執行用戶身份(uid)為該文件的主人,而不是調用該程序的進程的uid。 Setgid與之類似。Setuid和setgid用ls?–l顯示出來為s權限,存在于主人和屬組的執行權限的位置上。?
          ????這種權限的設置方法如下:?
          ????只設setuid:?chmod?4xxx?filename?(xxx為一般讀、寫、執行權限)?
          ????只設setgid:?chmod?2xxx?filename?
          ????同時設setuid和setgid:?chmod?6xxx?filename?
          ????取消兩種權限:?chmod?0xxx?filename?
          ????這種權限怎么用??
          ???? 舉個例子來說,假如某一命令(程序)的主人是root用戶,并且該文件有setuid屬性,但是該文件的讀、寫、執行權限的屬性表明普通用戶user1可以執行該命令,那么就表示:當該用戶執行該命令時,他具有root的執行身份,并獲得相應的權限。一旦該命令執行完成,該身份也隨之消失。?
          ????為什么系統中需要有這樣的權限呢?請執行以下操作:?
          ????7.1.?$?ls?–l?/etc/shadow?/bin/passwd?
          ? ???????-r-sr-sr-x?3?root? sys?99792?1999?2月?12?/bin/passwd?
          ? ???????-r--------?1?root? sys?261?1月?3?13:12?/etc/shadow?
          ????/etc/shadow 文件由于存有用戶的加密口令信息,對系統的安全至關重要,因此權限很嚴,只有root憑其對系統的至高無上的權限才得以對/etc/shadow可讀可寫。但是系統必須允許普通用戶也能修改自己的口令。要讓他們對/etc/shadow可寫,又不能可讀,而且可寫又不能允許他們改別人的口令,怎么辦?系統就采取這樣一個辦法:做一個程序,?也就是/bin/passwd,通過它可以在不顯示文件內容的情況下直接修改/etc/shadow文件。可是這個程序怎么能有這樣的權限?因為系統賦予它setuid權限,而且它屬于root.這樣,用戶在使用/bin/passwd改口令時就有root權限.由于 /bin/passwd命令本身功能的局限性,用戶并不能用它做更多的不利于系統安全的事。?
          ????7.2.?用普通用戶身份修改口令?
          ????$?passwd?
          ??????Enter?login?password:?****?
          ??????New?password:******?
          ??????Re-enter?new?password:******?
          ??????Passwd(SYSTEM):?passwd?successfully?changed?for?xxx?.?
          ??????可以成功。?
          ????7.3.?用超級用戶修改/bin/passwd的權限?
          ????#?chmod?0555?/bin/passwd?
          ????7.4.?再重復2,是否還成功?當然不。?
          ????7.5.把/bin/passwd的權限恢復原狀。?
          ?????#?chmod?6555?/bin/passwd?

          ???? 對此可以打一個生動的比喻:有一個絕密機關,不得已必須有一些不能見這些秘密的人進來做一些事情。于是授權一些特殊的“車輛”(沒有窗戶,門緊閉,所以看不到外面。只有一個小洞允許乘坐的人伸出一只手臂),帶著所乘坐的人開到要去的地方,允許它辦完事情馬上帶他出來。這樣是不是很安全?不一定。如果“車輛”沒有經過精挑細選是有很多“門窗”,那系統可就危險了。?
          ????這種安全威脅在Solaris中也有可能出現。比如做一下下面這個實驗:?
          ????7.6.?$?vi?/etc/shadow?
          ?????/etc/shadow:?Permission?denied.?
          ????7.7.?用超級用戶身份?
          ????#?chmod?6555?/bin/vi?
          ????#?chown?root?/bin/vi?
          ? ???7.8.?這次再用普通用戶身份試一試第6步,有什么結果?這次你能以普通用戶身份修改? ????????/etc/shadow了!!但是?
          $?more?/etc/shadow仍然不成功,說明在執行/bin/passwd時有超級用戶權限,平時仍是普通用戶身份。?
          ????再來看一個令人不安的情況:?
          ????7.9.用超級用戶身份?
          ????#?chmod?6555?/bin/ksh?
          ????#?chown?root?/bin/ksh?
          ????7.10.?用普通用戶身份?
          ????$?ksh?
          ????#?
          ????發生了什么情況??普通用戶不需要root口令就變成了root!!!?
          ????好可怕。如果有一個用戶曾有一次獲得超級用戶權限,并通過類似的方式給自己設置了后門(也可能放了一個類似的文件在他自己的家目錄中),以后他就可以隨時變成超級用戶了。?
          怎么能避免setuid的不安全影響,又利用其方便的地方?這里有幾點建議:?
          關鍵目錄應嚴格控制寫權限。比如/,/usr等。?
          ????對不管是root帳號還是普通用戶帳號的保密都有足夠的重視。最好不要設置類似于guest、public、test之類公用的容易猜出口令的帳號。?
          ????對系統中應該具有setuid權限的文件作一列表,定時檢查有沒有這之外的文件被設置了setuid權限。?
          ????下面有一個自己編的小程序與大家分享。?
          ????程序功能描述:檢查有沒有/usr/secu/masterlist文件記錄之外的其它文件被設置了setuid權限?
          ????事先要求:在系統調試完成,所有需要安裝的軟件安裝好以后,執行下面命令生成檢查對照文件?
          ????#?mkdir?–p?/usr/secu?
          ????#?find?/?-perm?–4000?–print?>;?/usr/secu/masterlist?
          ????程序:?
          ????cd?/tmp?
          ????[?-f?secrcheck?]?&&?rm?secrcheck?find?/?-perm?-4000?-print?>;secrcheck?for?f?in?`cat?secrcheck`?do?grep?-w?$f?/usr/secu/masterlist?>;/dev/null?if?[?"$?"?!=?"0"?];?then?echo?$f?is?not?in?list?
          ????fi?done?
          ????rm?secrcheck?在需要對系統做檢查時,執行本shell程序。也可以放在定時進程中定時檢查。程序由于需要在整個文件系統中做查找操作,需要比較長的時間。?
          ?????請您作完本文中的實驗后,別忘把文件的權限改回原狀。
          八、Solaris系統安全之審計
          作為C2安全等級操作系統(公安部二級),Solaris最主要的安全功能之一就是審計功能,本文將簡單介紹Solaris審計功能的使用和啟動。
          目的:紀錄系統和用戶事件,并對審計過程自身進行保護。這里值得注意的就是紀錄事件的細度。Solaris提供了很強大的審計功能,甚至可以紀錄每一條調試信息,但是這樣做是不明智的,因為很多信息對用戶沒用,而且會使系統性能下降。審計細度需要管理員根據用途和需要自行訂制。?
          實現:?
          ????8.1.?查看日志?
          ????1)?history文件?
          ????通常在根目錄下,隱藏文件,記錄了root執行的命令?
          ????2)?/var/adm?
          ????messages:記載來自系統核心的各種運行日志,可以記載的內容是由/etc/syslog.conf決定的?
          ????sulog:記載著普通用戶嘗試su成為其它用戶的紀錄。它的格式為:?發生時間?+/-(成功/失敗)?pts號?
          ????utmpx:這兩個文件是不具可讀性的,它們記錄著當前登錄在主機上的用戶,管理員可以用w,who等命令來看?
          ????wtmpx:相當于歷史紀錄,記錄著所有登錄過主機的用戶,時間,來源等內容,可用last命令來看?
          ????3)?/var/log?
          ????syslog文件,這個文件的內容一般是紀錄mail事件的?

          ????8.2.?syslog?
          ????1)?實時錯誤檢查:?
          ????tail?–f?/var/adm/messages?
          ????-f在監視器上允許看見每條記錄?/var/adm/messages記錄事件路徑?
          ????2)?/etc/syslog.conf語法:?
          ????*.err;kern.debug;deamon.notice;mail.crit?/var/adm/messages?

          ????工具認可的值?
          ????值?描述?
          ????user?用戶進程產生的消息。這是來自沒有在文件列表中的設備的消息的默認優先級?
          ????kern?由內核產生的消息?
          ????mail?郵件系統?
          ????daemon?系統守護進程?
          ????auth?授權系統,如login、su?
          ????lpr?行式打印機假脫機系統?
          ????news?網絡新聞系統USENET保留值?
          ????uucp?為UUCP系統保留值,目前UUCP不使用syslog機制?
          ????cron?Cron/at工具;crontab、at、cron?
          ????local0-7?為本地使用保留?
          ????mark?內部用于由syslog產生的時間戳消息?
          ????*?除標記工具之外的所有工具?
          ????級別認可的值(按重要性降序排列)?
          ????emerg?用于通常必須廣播給所有用戶的恐慌情況?
          ????alert?必須立即被修正的情況,例如被損壞的系統數據庫?
          ????crit?用戶對關鍵情況的告警,例如設備錯誤?
          ????err?用于其他錯誤?
          ????warning?用于所有的警告信息?
          ????notice?用于沒有錯誤但是可能需要特別處理的情況。?
          ????info?通知消息?
          ????debug?用于通常只在調試時才使用的消息?
          ????none?不發送從指出的設備發來的消息到選定文件中?
          ????3)?例如如果要紀錄登錄信息(telnet),可以這樣做:?
          ????/etc/default/login中:SYSLOG=YES?
          ????/etc/syslog.conf中添加:auth.notice?/export/home/wangyu/log?
          ????(把日志記錄在/export/home/wangyu/log文件中,中間不是空格,是Tab)?
          ????重新啟動syslog守護進程?
          ????當telnet上去的時候,我們看到/export/home/wangyu/log中有:?
          ????Sep?11?10:07:25?hlstar?login:?[ID?254462?auth.notice]?ROOT?LOGIN?/dev/pts/1?????FROM?192.168.0.9?

          ????8.3.?Loghost?
          ????編輯/etc/syslog.conf,語法:?
          ????*.err;kern.debug;deamon.notice;mail.crit?@loghost?
          ????(記錄登錄信息)?
          ????重新啟動syslog守護進程?
          ????假設這次我們使用linux做日志主機:?
          ?????[root@wangyu?root]#/sbin/setup?
          ????打開配置界面-->;firewall?configuration-->;custom-->;other?ports:?
          ????寫入?syslog:udp?
          ????重新啟動防火墻?
          ????/etc/init.d/iptables?restart或者/etc/init.d/ipchains?restart?
          ????設置loghost接收網絡日志數據,修改/etc/sysconfig/syslog配置文件:?
          ????修改?SYSLOGD_OPTIONS="-m?0"?為?SYSLOGD_OPTIONS="-r?-m?0"?
          ????重新啟動syslog守護進程?
          ????此時/var/log/messages最下端附近會看到類似下面的信息?
          ????Aug?11?21:20:30?logserver?syslogd?1.3-3:?restart.?(remote?reception)?
          ????當telnet上去的時候,我們看到/var/log/messages中有類似下面的信息:?
          ????Sep?5?11:08:31?mastadon?login:?[ID?507249?auth.notice]?Login?failure?on?/dev/pts/3?from?192.168.0.9,?root?

          ????8.4.?記帳?
          ????Solaris操作系統可以通過設置日志文件可以對每個用戶的每一條命令進行紀錄,這一功能默認是不開放的?
          ????運行/usr/lib/acct/accton?[路徑][文件名]?
          ????(如/usr/lib/acct/accton?/export/home/wangyu/test,將日志記錄到test中)?
          ????查看的時候將文件移動到/var/adm目錄下,改名為pacct?
          ????執行查看命令lastcomm(比如查看用戶root,用命令lastcomm?root)?

          ? ???8.5.?BSM(以下部分節減自freedemon的“SecU? Solaris?p2.3?BSM審計系統”,詳見????http: //bbs.nsfocus.net/index.php?act=ST&f=10&t=147174)?
          ????1)?開啟BSM:?
          ????#?init?1?(重新引導或改變運行級別到單用戶狀態)?
          ????#/etc/security/bsmconv?(運行BSM初始化腳本,開啟審計功能)?
          ????#?reboot?(重新啟動系統,或者Ctrl+D改變到多用戶狀態)?
          ????2)?關閉BSM審計功能:?
          ????#?init?1?
          ????#?/etc/security/bsmunconv?
          ????#?reboot?
          ????3)?配置文件的功能:?
          ????BSM所有的配置文件都存放在/etc/security目錄下(?(4)代表詳細信息察看man?(4)?:?
          ????audit_class(4)?
          ????審計類別定義?
          ????audit_control(4)?
          ????審計進程控制信息?
          ????audit_data(4)?
          ????審計進程當前信息?
          ????audit.log(4)審計日志格式?
          ????audit_event(4)?
          ????時間定義到類別的映射文件?
          ????audit_user(4)?
          ????按用戶審計時的用戶定義文件?
          ????除了上面的配置文件之外,系統中還有一些用于BSM管理的腳本。?
          ????audit_startup(1M)?
          ????啟動BSM進程運行。?
          ????auditconfig(1M)?
          ????讀取配置文件,重新配置audit進程。?
          ????auditd(1M)?
          ????審計監控服務。?
          ????auditreduce(1M)?
          ????審計事件日志管理,可以調整日志格式,生成時間周期等信息。?
          ????auditstat(1M)?
          ????先是內核審計進程狀態。?
          ????bsmconv(1M)?
          ????開啟BSM功能。?
          ????bsmunconv(1M)?
          ????關閉BSM功能。?
          ????praudit(1M)?
          ????打印BSM審計日志內容。?
          ????4)?BSM應用?
          ? ???在默認配置情況下,BSM每天(24小時)會生成一個以當天日期為名字的審計日志,存放在?? ??/var/audit目錄下,這個文件具有自己的數據結構,所以直接查看時是亂碼,必須使用系統命令?praudit 來查看。?
          ????#?praudit?/var/audit/xxxxxx.xxxxxx.log?
          ? ???另一個可能用到的命令是auditreduce?,這個命令允許管理員對審計日志做一些設置,例如調整審計事件集或調整審計日志生成周期等等。auditreduce和praudit是系統中BSM管理最基本的兩個命令,組合起來可以完成相當多的功能: ?
          ????用管道聯合兩個命令,會顯示系統中所有的歷史審計事件。?
          ????#?auditreduce?|?praudit?
          ????再加上lp,將把所有審計事件直接打印出來。
          ?? #?auditreduce?|?praudit?|?lp?
          ? ???如果系統中有相當多的審計信息的話,查找將是非常困難的事情,這條命令可以按照yymmdd的時間格式顯示目標時間段內的審計事件,范例為顯示April?13,?1990,?用戶fred的登錄類別審計事件集。?
          ????#?auditreduce?-d?900413?-u?fred?-c?lo?|?praudit?
          ????過濾目標時間所有的登錄日志信息(Class:lo),并且輸出到一個單獨的日志文件中:?
          ????#?auditreduce?-c?lo?-d?870413?-O?/usr/audit_summary/logins?
          ? ???auditreduce的?-b?和?-a?選項允許用戶按照 ?yyyymmdd00:00:00?的時間格式制定一個時間段(Before?&?After)。 ?
          ????#?auditreduce?-a?91071500:00:00?|?praudit?
          ????#?auditreduce?-b?91071500:00:00?|?praudit?
          ????5)?管理工具:?
          ????eXpert-BSMTM?
          ????一個很強大的商業BSM分析工具,不過目前也可以免費使用,支持Solaris?7/8?(Sparc|Intel)平臺,可以在下面地址下載。?
          http://www.sdl.sri.com/projects/emerald/releases/eXpert-BSM/download.html?
          ????Sun?WBEM?
          ????Solaris內置的圖形界面管理工具,也就是AdminConsole,在WBEM?2.3之后的版本支持對BSM信息的管理。可以用下面命令開啟:?
          ????#?/usr/sadm/bin/wbemadmin?(第一次運行時會安裝一系列的管理腳本)?
          ????#?/usr/sadm/bin/smc?(開啟管理終端)?

          ????以上,對Solaris審計系統進行了配置,相信大部分用戶行為和入侵行為都被記錄下來了,并且對日志自身也進行了一定保護。如果管理員能及時分析日志,相信可以捕獲大部分入侵企圖和行為。

          posted @ 2006-11-05 17:14 狼愛上貍 閱讀(555) | 評論 (0)編輯 收藏

          給solaris打補丁

          出處:http://www.xxlinux.com/linux/article/unix/rumen/2006-06-25/2117.html

          一、solaris補丁介紹?

          1.1補丁的種類及文件名?
          ????solaris的補丁分為兩類,一類是Point補丁,另一類是Cluster補丁。?

          a)Point補丁程序:?
          ? ?????這類補丁僅僅是針對某一問題或缺陷而發布的單個補丁程序,solaris7、 solaris8、solairs9的Patch一般為*.zip文件solaris2.6一般為.tar.Z或.tar.gz文件,它有如下編號方式:
          patch?base?code-revision?num??(如110668-04)
          前面部分是這個補丁的主版本號(base?code),后面部分是此補丁的修訂號。兩者合起來構成此補丁的Patch-ID。如上例編號為110668- 04的補丁,110668為主版本號,04是修訂號。此補丁是在110668-03的基礎上做了新的修復。有一點需要指出,補丁版本號為110668的一系列補丁都是針對?/usr/sbin/in.telnetd?這一文件的不同問題的修復,110668-04發布以后,sun將不再提供110668- 04以前的補丁,如110668-03等。?

          b)?Cluster補丁程序:??
          ????cluster補丁僅僅是一系列point補丁的重新包裝,并帶有自動安裝程序。Cluster補丁的命名方式如下:
          version_Recommended?
          如:9_x86_Recommended.zip是針對Solaris?9?for?X86的補丁集。?
          ????8_Recommended.zip是針對Solaris?8?for?Sparc?的補丁集。?
          ????每個Cluster補丁都對應一個CLUSTER_README文件,詳細描述了該Cluster包含的補丁,以及安裝的方法或注意事項。?

          1.2?關于補丁的其他信息?
          ? ???sun公司對每一版本的solaris都維護了一份Patch?Reports,該 Patch?Reports包含了對應版本solaris所有補丁的描述。Patch?Reports每月更新兩次,可以從如下地址得到:?
          http://sunsolve.sun.com/pub-cgi/show.pl?target=patches/patch-access&nav=patchpage?

          ???? 另外sun還維護了一份Sun?Alert?Patch?Report,該文檔按產品分類,并且隨時更新。從這里可以找到所有sun產品的更新文檔及相應補丁,當然也包括的solaris的Sun?Alert?文檔、Patch?ID、簡要說明等。Sun?Alert?Patch?Report從這里可以得到:?
          http://sunsolve.sun.com/pub-cgi/show.pl?target=sunalert_patches?
          相應的solaris部分可從如下鏈接得到:?
          http://sunsolve.sun.com/pub-cgi/show.pl?target=sunalert_patches#Solaris?
          表格按時間排序,從Category表格中可以知道此問題屬于安全缺陷修復還是應用優化。?

          二、補丁的下載?
          ????Cluster補丁可以從如下網址下載:
          http://sunsolve.sun.com/pub-cgi/show.pl?target=patches/patch-access&nav=patchpage?
          同樣可以使用FTP協議下載,在sunsolve.sun.com的/pacthroot/clusters可以找到所有的Cluster補丁。下載后為一個*_Recommended.zip文件。該壓縮文件包含一份CLUSTER_README文件,建議安裝前閱讀此文件。?
          ????Point 補丁由于其分散性不易下載與管理,可以使用Sun?Alert?Patch?Report或Patch?Reports來查看補丁情況,這兩份文檔相應的 Patch?ID及對應下載地址。另外sun網站提供的Patch?Finder?功能也可以使我們在知道Patch?ID的情況下很方便的找到該補丁,連接如下:?
          http://sunsolve.sun.com/pub-cgi/show.pl?target=patches/patch-access&nav=patchpage?
          同樣,利用ftp協議從sunsolve.sun.com的/patchroot/all_unsigned目錄下也可以下載指定Patch。?
          ????Sun公司建議所有下載的補丁都放到/var/tmp目錄下(這也是通常的做法),如此將不會導致補丁安裝時出現的任何permission/ownership的問題。

          三、solaris補丁的安裝和刪除?

          3.1?/var/sadm/patch目錄?
          ????在/var/sadm/patch目錄下,記錄了已安裝的補丁。?
          ????如:?#?ls?/var/sadm/patch??
          ????107558-05?107594-04?107630-01?107663-01?107683-01??
          ????107696-01?107817-01?107582-01?107612-06?107640-03?
          ????建議不要對此目錄做任何修改,此目錄被破壞后將不能安裝或刪除任何補丁。?

          3.2?管理solaris補丁?
          ????Solaris 提供了兩個命令來管理補丁,patchadd和patchrm。這兩個命令是在Solaris?2.6版本開始提供的,在2.6以前的版本中,每個補丁包中都提供了一個installpatch?程序和一個backoutpatch?程序來完成補丁的安裝和卸載。
          ????patchadd用來安裝解壓縮后的補丁程序。patchadd通過調用pkgadd?命令來安裝補丁。安裝補丁前,我們需要將補丁解壓到/var/tmp下安裝。安裝補丁如下命令:?
          ????#?cd?/var/tmp?
          ????#?patchadd?110668-04?
          ????Checking?installed?patches...?
          ????Verifying?sufficient?filesystem?capacity?(dry?run?method)?
          ????Installing?patch?packages...?
          ?????
          ???? 如果當前目錄下有110668-04目錄,patchadd將安裝此補丁。補丁安裝后,系統會備份原文件,以便在以后刪除此補丁。如果使用 patchadd?-d?選項安裝補丁,系統將不備份源文件,這意味著你將不能在以后刪除此補丁。使用patchadd?-p?選項可以檢驗已安裝的 patch,例如:?
          ????#?patchadd?-p?
          ????Patch:?106793-01?Obsoletes:?Requires:?Incompatibles:?
          ????Packages:?SUNWhea?
          ????.?.?.?
          ????同樣,solaris提供了另一命令來查看已安裝的patch:?
          ????#?showrev?-p?
          ????Patch:?106793-01?Obsoletes:?Requires:?Incompatibles:?
          ????Packages:?SUNWhea?
          ????.?.?.?
          ? ???patchrm?如果因為某種情況你想卸載某一補丁,你可以使用patchrm命令來完成。此命令通過調用?pkgadd來恢復安裝補丁前的文件備份來卸載補丁。使用Patch-ID作為patchrm的參數就可以卸載補丁:?
          ????#?patchrm?106793-01?
          ????Checking?installed?packages?and?patches...?
          ????Backing?out?patch?106793-01...?
          ????Patch?106793-01?has?been?backed?out.?
          ????這里需要說明一下,在如下三種情況下,補丁將不能卸載:?
          ????1).在安裝patch時,用patchadd?-d命令指定patchadd不備份被更新的文件。這樣安裝的patch無法刪除。?
          ????2).另一patch需要此patch,即存在dependence(關聯性),?如一定要刪掉該patch,先刪掉另一patch。?
          ? ???3).要刪的patch已被另一更新的patch廢棄了。如安裝110668-04補丁后,如果以前安裝過 110668-03,則110668-03將被110668-04廢棄,110668-03將無法刪除。?

          3.3?Cluster補丁的安裝?
          ????Cluster 補丁為單個補丁的集合,下載解壓后,可以通過執行./install_Cluster腳本來完成補丁集的安裝。執行./install_Cluster 后,腳本將檢查當前目錄下的patch_order文件,此文件標明了Patch的安裝順序,./install_Cluster將按照 patch_order文件給出的順序來安裝patch。如果沒有patch_order文件,則假定當前目錄下所有以1開始的目錄名均為需要安裝的補丁目錄,并且假定這些目錄的名稱次序作為安裝Patch的次序。因此你可以通過修改patch_order文件來決定安裝或不安裝某Patch。?

          3.4?安裝Patch時的注意事項?
          ? ???由于在安裝Patch時需要更新文件,故此Solaris官方推薦在安裝補丁時進入單用戶模式安裝。在某些重要服務器上可能帶來不便,因此你完全可以在多用戶模式下通過停止相關服務進程來完成Patch的安裝。?
          ????Sun 推出的Patch并不是每個都一定要安裝的,因此需要在安裝patch前仔細閱讀README來確定是否需要安裝此補丁。另外,某些補丁具有依賴性,需要先安裝另一補丁才能完成此補丁的安裝,這些都會在README中標明。總之,安裝補丁之前強烈建議你閱讀相應的README(每個Patch都提供單獨的 README文件)。?

          3.5?安裝PATCH過程中出現的問題?
          ????在安裝補丁的過程中,經常出現一些錯誤提示。例如:?
          ????Installation?of?123456-11?failed.?Return?code?2?
          ???? 通過Return?code我們可以知道錯誤類型。需要注意的是,Return?code?2說明此補丁已被安裝,Return?code?8說明此補丁要修復的軟件沒有被系統安裝。因此,2和8是完全可以被忽略的錯誤提示。下表說明了各個Return?code對應的錯誤類型。?
          Exit?code?Meaning??
          0?No?error??
          1?Usage?error??
          2?Attempt?to?apply?a?patch?that's?already?been?applied??
          3?Effective?UID?is?not?root??
          4?Attempt?to?save?original?files?failed??
          5?pkgadd?failed??
          6?Patch?is?obsoleted??
          7?Invalid?package?directory??
          8?Attempting?to?patch?a?package?that?is?not?installed??
          9?Cannot?access?/usr/sbin/pkgadd?(client?problem)??
          10?Package?validation?errors??
          11?Error?adding?patch?to?root?template??
          12?Patch?script?terminated?due?to?signal??
          13?Symbolic?link?included?in?patch??
          14?NOT?USED??
          15?The?prepatch?script?had?a?return?code?other?than?0.??
          16?The?postpatch?script?had?a?return?code?other?than?0.

          posted @ 2006-11-05 17:13 狼愛上貍 閱讀(402) | 評論 (0)編輯 收藏

          myslq日期與時間函數

          對于每個類型擁有的值范圍以及并且指定日期何時間值的有效格式的描述見7.3.6?日期和時間類型。?

          這里是一個使用日期函數的例子。下面的查詢選擇了所有記錄,其date_col的值是在最后30天以內:?

          mysql>?SELECT?something?FROM?table?
          WHERE?TO_DAYS(NOW())?-?TO_DAYS(date_col)?<=?30;?

          DAYOFWEEK(date)?
          返回日期date的星期索引(1=星期天,2=星期一,?……7=星期六)。這些索引值對應于ODBC標準。?
          mysql>?select?DAYOFWEEK('1998-02-03');?
          ->?3?

          WEEKDAY(date)?
          返回date的星期索引(0=星期一,1=星期二,?……6=?星期天)。?
          mysql>?select?WEEKDAY('1997-10-04?22:23:00');?
          ->?5?
          mysql>?select?WEEKDAY('1997-11-05');?
          ->?2?

          DAYOFMONTH(date)?
          返回date的月份中日期,在1到31范圍內。?
          mysql>?select?DAYOFMONTH('1998-02-03');?
          ->?3?

          DAYOFYEAR(date)?
          返回date在一年中的日數,?在1到366范圍內。?
          mysql>?select?DAYOFYEAR('1998-02-03');?
          ->?34?

          MONTH(date)?
          返回date的月份,范圍1到12。?
          mysql>?select?MONTH('1998-02-03');?
          ->?2?

          DAYNAME(date)?
          返回date的星期名字。?
          mysql>?select?DAYNAME("1998-02-05");?
          ->?'Thursday'?

          MONTHNAME(date)?
          返回date的月份名字。?
          mysql>?select?MONTHNAME("1998-02-05");?
          ->?'February'?

          QUARTER(date)?
          返回date一年中的季度,范圍1到4。?
          mysql>?select?QUARTER('98-04-01');?
          ->?2?

          WEEK(date)?
           ?
          WEEK(date,first)?
          對于星期天是一周的第一天的地方,有一個單個參數,返回date的周數,范圍在0到52。2個參數形式WEEK()允許
          你指定星期是否開始于星期天或星期一。如果第二個參數是0,星期從星期天開始,如果第二個參數是1,
          從星期一開始。?
          mysql>?select?WEEK('1998-02-20');?
          ->?7?
          mysql>?select?WEEK('1998-02-20',0);?
          ->?7?
          mysql>?select?WEEK('1998-02-20',1);?
          ->?8?

          YEAR(date)?
          返回date的年份,范圍在1000到9999。?
          mysql>?select?YEAR('98-02-03');?
          ->?1998?

          HOUR(time)?
          返回time的小時,范圍是0到23。?
          mysql>?select?HOUR('10:05:03');?
          ->?10?

          MINUTE(time)?
          返回time的分鐘,范圍是0到59。?
          mysql>?select?MINUTE('98-02-03?10:05:03');?
          ->?5?

          SECOND(time)?
          回來time的秒數,范圍是0到59。?
          mysql>?select?SECOND('10:05:03');?
          ->?3?

          PERIOD_ADD(P,N)?
          增加N個月到階段P(以格式YYMM或YYYYMM)。以格式YYYYMM返回值。注意階段參數P不是日期值。?
          mysql>?select?PERIOD_ADD(9801,2);?
          ->?199803?

          PERIOD_DIFF(P1,P2)?
          返回在時期P1和P2之間月數,P1和P2應該以格式YYMM或YYYYMM。注意,時期參數P1和P2不是日期值。?
          mysql>?select?PERIOD_DIFF(9802,199703);?
          ->?11?

          DATE_ADD(date,INTERVAL?expr?type)?
           ?
          DATE_SUB(date,INTERVAL?expr?type)?
           ?
          ADDDATE(date,INTERVAL?expr?type)?
           ?
          SUBDATE(date,INTERVAL?expr?type)?
          這些功能執行日期運算。對于MySQL?3.22,他們是新的。ADDDATE()和SUBDATE()是DATE_ADD()和DATE_SUB()的同義詞。
          在MySQL?3.23中,你可以使用+和-而不是DATE_ADD()和DATE_SUB()。(見例子)date是一個指定開始日期的
          DATETIME或DATE值,expr是指定加到開始日期或從開始日期減去的間隔值一個表達式,expr是一個字符串;它可以以
          一個“-”開始表示負間隔。type是一個關鍵詞,指明表達式應該如何被解釋。EXTRACT(type?FROM?date)函數從日期
          中返回“type”間隔。下表顯示了type和expr參數怎樣被關聯:?type值?含義?期望的expr格式?
          SECOND?秒?SECONDS?
          MINUTE?分鐘?MINUTES?
          HOUR?時間?HOURS?
          DAY?天?DAYS?
          MONTH?月?MONTHS?
          YEAR?年?YEARS?
          MINUTE_SECOND?分鐘和秒?"MINUTES:SECONDS"?
          HOUR_MINUTE?小時和分鐘?"HOURS:MINUTES"?
          DAY_HOUR?天和小時?"DAYS?HOURS"?
          YEAR_MONTH?年和月?"YEARS-MONTHS"?
          HOUR_SECOND?小時,?分鐘,?"HOURS:MINUTES:SECONDS"?
          DAY_MINUTE?天,?小時,?分鐘?"DAYS?HOURS:MINUTES"?
          DAY_SECOND?天,?小時,?分鐘,?秒?"DAYS?HOURS:MINUTES:SECONDS"?

          MySQL在expr格式中允許任何標點分隔符。表示顯示的是建議的分隔符。如果date參數是一個DATE值并且你的計算僅僅
          包含YEAR、MONTH和DAY部分(即,沒有時間部分),結果是一個DATE值。否則結果是一個DATETIME值。?

          mysql>?SELECT?"1997-12-31?23:59:59"?+?INTERVAL?1?SECOND;?
          ->?1998-01-01?00:00:00?
          mysql>?SELECT?INTERVAL?1?DAY?+?"1997-12-31";?
          ->?1998-01-01?
          mysql>?SELECT?"1998-01-01"?-?INTERVAL?1?SECOND;?
          ->?1997-12-31?23:59:59?
          mysql>?SELECT?DATE_ADD("1997-12-31?23:59:59",?
          INTERVAL?1?SECOND);?
          ->?1998-01-01?00:00:00?
          mysql>?SELECT?DATE_ADD("1997-12-31?23:59:59",?
          INTERVAL?1?DAY);?
          ->?1998-01-01?23:59:59?
          mysql>?SELECT?DATE_ADD("1997-12-31?23:59:59",?
          INTERVAL?"1:1"?MINUTE_SECOND);?
          ->?1998-01-01?00:01:00?
          mysql>?SELECT?DATE_SUB("1998-01-01?00:00:00",?
          INTERVAL?"1?1:1:1"?DAY_SECOND);?
          ->?1997-12-30?22:58:59?
          mysql>?SELECT?DATE_ADD("1998-01-01?00:00:00",?
          INTERVAL?"-1?10"?DAY_HOUR);?
          ->?1997-12-30?14:00:00?
          mysql>?SELECT?DATE_SUB("1998-01-02",?INTERVAL?31?DAY);?
          ->?1997-12-02?
          mysql>?SELECT?EXTRACT(YEAR?FROM?"1999-07-02");?
          ->?1999?
          mysql>?SELECT?EXTRACT(YEAR_MONTH?FROM?"1999-07-02?01:02:03");?
          ->?199907?
          mysql>?SELECT?EXTRACT(DAY_MINUTE?FROM?"1999-07-02?01:02:03");?
          ->?20102?

          如果你指定太短的間隔值(不包括type關鍵詞期望的間隔部分),MySQL假設你省掉了間隔值的最左面部分。例如,
          如果你指定一個type是DAY_SECOND,值expr被希望有天、小時、分鐘和秒部分。如果你象"1:10"這樣指定值,
          MySQL假設日子和小時部分是丟失的并且值代表分鐘和秒。換句話說,"1:10"?DAY_SECOND以它等價于"1:10"?MINUTE_SECOND
          的方式解釋,這對那MySQL解釋TIME值表示經過的時間而非作為一天的時間的方式有二義性。如果你使用確實不正確的日期,
          結果是NULL。如果你增加MONTH、YEAR_MONTH或YEAR并且結果日期大于新月份的最大值天數,日子在新月用最大的天調整。?

          mysql>?select?DATE_ADD('1998-01-30',?Interval?1?month);?
          ->?1998-02-28?

          注意,從前面的例子中詞INTERVAL和type關鍵詞不是區分大小寫的。?
          TO_DAYS(date)?
          給出一個日期date,返回一個天數(從0年的天數)。?
          mysql>?select?TO_DAYS(950501);?
          ->?728779?
          mysql>?select?TO_DAYS('1997-10-07');?
          ->?729669?

          TO_DAYS()不打算用于使用格列高里歷(1582)出現前的值。?

          FROM_DAYS(N)?
          給出一個天數N,返回一個DATE值。?
          mysql>?select?FROM_DAYS(729669);?
          ->?'1997-10-07'?

          TO_DAYS()不打算用于使用格列高里歷(1582)出現前的值。?

          DATE_FORMAT(date,format)?
          根據format字符串格式化date值。下列修飾符可以被用在format字符串中:?%M?月名字(January……December)?
          %W?星期名字(Sunday……Saturday)?
          %D?有英語前綴的月份的日期(1st,?2nd,?3rd,?等等。)?
          %Y?年,?數字,?4?位?
          %y?年,?數字,?2?位?
          %a?縮寫的星期名字(Sun……Sat)?
          %d?月份中的天數,?數字(00……31)?
          %e?月份中的天數,?數字(0……31)?
          %m?月,?數字(01……12)?
          %c?月,?數字(1……12)?
          %b?縮寫的月份名字(Jan……Dec)?
          %j?一年中的天數(001……366)?
          %H?小時(00……23)?
          %k?小時(0……23)?
          %h?小時(01……12)?
          %I?小時(01……12)?
          %l?小時(1……12)?
          %i?分鐘,?數字(00……59)?
          %r?時間,12?小時(hh:mm:ss?[AP]M)?
          %T?時間,24?小時(hh:mm:ss)?
          %S?秒(00……59)?
          %s?秒(00……59)?
          %p?AM或PM?
          %w?一個星期中的天數(0=Sunday?……6=Saturday?)?
          %U?星期(0……52),?這里星期天是星期的第一天?
          %u?星期(0……52),?這里星期一是星期的第一天?
          %%?一個文字“%”。?

          所有的其他字符不做解釋被復制到結果中。?

          mysql>?select?DATE_FORMAT('1997-10-04?22:23:00',?'%W?%M?%Y');?
          ->?'Saturday?October?1997'?
          mysql>?select?DATE_FORMAT('1997-10-04?22:23:00',?'%H:%i:%s');?
          ->?'22:23:00'?
          mysql>?select?DATE_FORMAT('1997-10-04?22:23:00',?
          '%D?%y?%a?%d?%m?%b?%j');?
          ->?'4th?97?Sat?04?10?Oct?277'?
          mysql>?select?DATE_FORMAT('1997-10-04?22:23:00',?
          '%H?%k?%I?%r?%T?%S?%w');?
          ->?'22?22?10?10:23:00?PM?22:23:00?00?6'?
          MySQL3.23中,在格式修飾符字符前需要%。在MySQL更早的版本中,%是可選的。?

          TIME_FORMAT(time,format)?
          這象上面的DATE_FORMAT()函數一樣使用,但是format字符串只能包含處理小時、分鐘和秒的那些格式修飾符。
          其他修飾符產生一個NULL值或0。?
          CURDATE()?
           ?
          CURRENT_DATE?
          以'YYYY-MM-DD'或YYYYMMDD格式返回今天日期值,取決于函數是在一個字符串還是數字上下文被使用。?
          mysql>?select?CURDATE();?
          ->?'1997-12-15'?
          mysql>?select?CURDATE()?+?0;?
          ->?19971215?

          CURTIME()?
           ?
          CURRENT_TIME?
          以'HH:MM:SS'或HHMMSS格式返回當前時間值,取決于函數是在一個字符串還是在數字的上下文被使用。?
          mysql>?select?CURTIME();?
          ->?'23:50:26'?
          mysql>?select?CURTIME()?+?0;?
          ->?235026?

          NOW()?
           ?
          SYSDATE()?
           ?
          CURRENT_TIMESTAMP?
          以'YYYY-MM-DD?HH:MM:SS'或YYYYMMDDHHMMSS格式返回當前的日期和時間,取決于函數是在一個字符串還是在數字的
          上下文被使用。?
          mysql>?select?NOW();?
          ->?'1997-12-15?23:50:26'?
          mysql>?select?NOW()?+?0;?
          ->?19971215235026?

          UNIX_TIMESTAMP()?
           ?
          UNIX_TIMESTAMP(date)?
          如果沒有參數調用,返回一個Unix時間戳記(從'1970-01-01?00:00:00'GMT開始的秒數)。如果UNIX_TIMESTAMP()用一
          個date參數被調用,它返回從'1970-01-01?00:00:00'?GMT開始的秒數值。date可以是一個DATE字符串、一個DATETIME
          字符串、一個TIMESTAMP或以YYMMDD或YYYYMMDD格式的本地時間的一個數字。?
          mysql>?select?UNIX_TIMESTAMP();?
          ->?882226357?
          mysql>?select?UNIX_TIMESTAMP('1997-10-04?22:23:00');?
          ->?875996580?

          當UNIX_TIMESTAMP被用于一個TIMESTAMP列,函數將直接接受值,沒有隱含的“string-to-unix-timestamp”變換。?

          FROM_UNIXTIME(unix_timestamp)?
          以'YYYY-MM-DD?HH:MM:SS'或YYYYMMDDHHMMSS格式返回unix_timestamp參數所表示的值,取決于函數是在一個字符串
          還是或數字上下文中被使用。?
          mysql>?select?FROM_UNIXTIME(875996580);?
          ->?'1997-10-04?22:23:00'?
          mysql>?select?FROM_UNIXTIME(875996580)?+?0;?
          ->?19971004222300?

          FROM_UNIXTIME(unix_timestamp,format)?
          返回表示?Unix?時間標記的一個字符串,根據format字符串格式化。format可以包含與DATE_FORMAT()函數列出的條
          目同樣的修飾符。?
          mysql>?select?FROM_UNIXTIME(UNIX_TIMESTAMP(),?
          '%Y?%D?%M?%h:%i:%s?%x');?
          ->?'1997?23rd?December?03:43:30?x'?

          SEC_TO_TIME(seconds)?
          返回seconds參數,變換成小時、分鐘和秒,值以'HH:MM:SS'或HHMMSS格式化,取決于函數是在一個字符串還是在數字
          上下文中被使用。?
          mysql>?select?SEC_TO_TIME(2378);?
          ->?'00:39:38'?
          mysql>?select?SEC_TO_TIME(2378)?+?0;?
          ->?3938?

          TIME_TO_SEC(time)?
          返回time參數,轉換成秒。?
          mysql>?select?TIME_TO_SEC('22:23:00');?
          ->?80580?
          mysql>?select?TIME_TO_SEC('00:39:38');?
          ->?2378

          posted @ 2006-11-05 17:10 狼愛上貍 閱讀(421) | 評論 (0)編輯 收藏

          Solaris 10操作系統的以太網卡設置(二)--網卡設置入門篇

          出處:http://isv.sun.com.cn/message/common/msgview.jsp?msgid=10336

          二. 網卡設置入門篇

          上一篇我們介紹的是網卡驅動程序的安裝過程,并成功安裝了VIA rhine II網卡的驅動程序。本篇將以上一篇中安裝的網卡rh0為例,對IP地址和子網掩碼等一些基本的網絡參數進行設置。
          通常的設置方式有兩種,一是使用ifconfig命令,二是通過創建和修改相關配置文件。使用ifconfig命令,可以使設置立即生效,但設置是臨時的,每次系統重啟后,需要重新進行設置。而創建和修改配置文件,可保存設置,系統每次啟動時,會根據配置文件的內容自動對網卡進行設置。

          1. 使用ifconfig命令對網卡進行設置

          1) 激活網卡(# ifconfig plumb up)
          激活網卡的意義在于將網卡驅動程序加載到Solaris系統的內核中,激活之后才可以進一步對網卡進行操作。

          手動激活rh0,
          # ifconfig rh0 plumb up

          驗證結果,
          # ifconfig -a
          lo0: flags=2001000849 mtu 8232 index 1
          inet 127.0.0.1 netmask ff000000
          rh0: flags=1000843 mtu 1500 index 2
          inet 0.0.0.0 netmask 0
          ether 0:8:d:6e:8b:f1
          可以看到rh0已被激活,但還沒有分配地址。

          2) 分配地址
          網卡地址分配通常包括靜態分配和dhcp動態分配兩種方式。任選其一。

          a) 靜態分配地址(命令 # ifconfig <interface> <address> netmask <netmask>)

          把IP: 129.158.215.204 , netmask: 255.255.255.0分配給rh0,
          # ifconfig rh0 129.158.215.204 netmask 255.255.255.0

          驗證結果,
          # ifconfig rh0
          rh0: flags=1000843 mtu 1500 index 2
          inet 129.158.215.204 netmask ffffff00 broadcast 129.158.215.255
          ether 0:8:d:6e:8b:f1
          IP和子網掩碼已生效。

          b) 通過dhcp方式分配地址(命令 # ifconfig dhcp )

          重新激活rh0,
          # ifconfig rh0 unplumb down
          # ifconfig rh0 plumb up

          通過dhcp方式獲得IP和子網掩碼,
          # ifconfig rh0 dhcp

          驗證結果,
          # ifconfig rh0
          rh0: flags=1004843 mtu 1500 index 2
          inet 129.158.215.247 netmask ffffff00 broadcast 129.158.215.255
          ether 0:8:d:6e:8b:f1
          已自動獲取到IP和子網掩碼。

          2. 通過配置文件對網卡進行設置

          和網卡基本設置相關的配置文件放在/etc/inet和/etc目錄下,包括
          /etc/hosts -> /etc/inet/hosts (文件中的每一行記錄表示hostname和ip地址的對應關系)
          /etc/hostname. (文件內容和文件的擴展名構成hostname和interface設備名的對應關系)
          /etc/netmasks (文件中的每一行記錄表示和netmask的對應關系)
          /etc/dhcp. (dhcp)
          創建和修改配置文件后,需要重啟系統才能使設置生效。
          1) 分配地址
          同樣包括靜態分配和dhcp動態分配兩種方式。任選其一。

          a) 靜態分配地址(文件 /etc/hosts , /etc/netmask , /etc/hostname.

          1> 自定義一個hostname,并指定IP地址
          # vi /etc/hosts
          加入一行記錄:129.158.215.204 myhostname loghost
          :x!保存退出。

          2> 定義子網掩碼
          # vi /etc/netmasks
          加入一行記錄:129.158.215.0 255.255.255.0
          :wq保存退出。

          3> 將自定義的hostname關聯到rh0
          # vi hostname.rh0
          加入一行記錄:myhostname
          :wq保存退出。

          b) 通過dhcp方式分配地址(文件 /etc/hostaname. , /etc/dhcp.

          1> 創建空文件hostname.rh0
          # touch /etc/hostname.rh0

          2> 創建文件dhcp.rh0
          # touch /etcdhcp.rh0
          需要的話還可以在該文件中填入超時時間(秒),比如:30

          2) 重啟系統
          # reboot

          3) 常見問題:
          在/etc/hosts文件中修改了IP地址,重啟后,發現機器的IP地址還是原來的,是怎么回事?
          問題可能出在/etc/inet/ipnodes文件。該文件的語法跟/etc/hosts相同,但優先級高于/etc/hosts。如果/etc/inet/ipnodes文件中保留了原來的IP地址,那么/etc/hosts中相同hostname的IP設置將被忽略。將ipnodes文件中的IP地址一行刪掉,或改成新的IP地址,重啟后,問題就消失了。

          3. sys-unconfig
          如果覺得使用ifconfig命令和手工修改配置文件太麻煩,可運行sys-unconfig命令,以交互方式對系統重新進行設置。執行
          # sys-unconfig
          重啟后,系統會提示對網卡進行設置,并將設置結果自動保存到配置文件中。

          posted @ 2006-11-05 17:05 狼愛上貍 閱讀(3091) | 評論 (0)編輯 收藏

          GBK->Unicode

          把特定編碼文件信息的文件轉換為Unicode編碼的文件:
          c:\jdk1.5\bin\> native2ascii -encoding GBK a.txt > custMessages_zh.properties

          posted @ 2006-11-05 17:03 狼愛上貍 閱讀(310) | 評論 (0)編輯 收藏

          JAVA混淆編譯工具總匯

          現在企業中用java作為開發語言的越來越多,但是代碼的安全問題也很嚴重,對java的代碼保護最常用的策略是對代碼進行混淆編譯,有很多工具可以供大家選擇。

          Author/Company Program Shrinking Obfuscation License
          Eric Lafortune ProGuard x x Free (GPL)
          Jochen Hoenicke Jode x x Free (GPL)
          Hidetoshi Ohuchi Jarg x x Free (BSD)
          NQ4 Joga x x Free (no source)
          Alexander Shvets CafeBabe x x Free
          Nate Nystrom Bloat x
          Free
          RiggsHill Software GenJar x
          Free (Apache)
          RetroLogic RetroGuard
          x Free (LGPL)
          Thorsten Heit JavaGuard
          x Free (LGPL)
          Patrick Mueller Mwobfu
          x Free (GPL)
          Bajie JCMP
          x Free
          yWorks yGuard
          x Free
          Dr. Java Marvin Obfuscator
          x Free (no source)
          IBM AlphaWorks JAX x x Commercial
          PreEmptive DashOPro x x Commercial
          Zelix KlassMaster x x Commercial
          S5 Systems jPresto x x Commercial
          CodingArt CodeShield x x Commercial
          Plumb Design Condensity x x Commercial
          Eastridge Technology Jshrink x x Commercial
          Helseth JObfuscator x x Commercial
          LeeSoftware Smokescreen Obfuscator x x Commercial
          Vega Technologies JZipper x x Commercial
          Sergey Sverdlov J.Class Optimizer x
          Commercial
          Force 5 JCloak
          x Commercial
          WingSoft WingGuard
          x Commercial
          JAMM Consulting ObfuscatePro
          x Commercial
          2LKit 2LKit Obfuscator
          x Commercial
          Duckware Jobfuscate
          x Commercial

          出處:http://www.zahui.com/html/6/11879.htm

          posted @ 2006-11-05 12:19 狼愛上貍 閱讀(426) | 評論 (0)編輯 收藏

          Unicode是什么,UTF-8是什么

          一直在編碼方面要求不是很高,所以對Unicode和UTF-8也不甚了解。
            最近偶然翻到一篇UTF-8的文章,感覺解釋的非常繁雜,因此才想到重新寫一篇簡單易懂一點的。


            首先說明一下現在常用的一些編碼方案:
            1、在中國,大陸最常用的就是GBK18030編碼,除此之外還有GBK,GB2312,這幾個編碼的關系是這樣的。
          最早制定的漢字編碼是GB2312,包括6763個漢字和682個其它符號
          95年重新修訂了編碼,命名GBK1.0,共收錄了21886個符號。
          之后又推出了GBK18030編碼,共收錄了27484個漢字,同時還收錄了藏文、蒙文、維吾爾文等主要的少數民族文字,現在WINDOWS平臺必需要支持GBK18030編碼。

          按照GBK18030、GBK、GB2312的順序,3種編碼是向下兼容,同一個漢字在三個編碼方案中是相同的編碼。

            2、臺灣,香港等地使用的是BIG5編碼
            3、日本:SJIS編碼

            如果把各種文字編碼形容為各地的方言,那么Unicode就是世界各國合作開發的一種語言。
            在這種語言環境下,不會再有語言的編碼沖突,在同屏下,可以顯示任何語言的內容,這就是Unicode的最大好處。

            那么Unicode是如何編碼的呢?其實非常簡單。
            就是將世界上所有的文字用2個字節統一進行編碼。可能你會問,2個字節最多能夠表示65536個編碼,夠用嗎?
            韓國和日本的大部分漢字都是從中國傳播過去的,字型是完全一樣的。
            比如:“文”字,GBK和SJIS中都是同一個漢字,只是編碼不同而已。
            那樣,像這樣統一編碼,2個字節就已經足夠容納世界上所有的語言的大部分文字了。

            Unicode的學名是"Universal Multiple-Octet Coded Character Set",簡稱為UCS。
            現在用的是UCS-2,即2個字節編碼,而UCS-4是為了防止將來2個字節不夠用才開發的。UCS-2也稱為基本多文種平面。
            UCS-2轉換到UCS-4只是簡單的在前面加2個字節0。
            UCS-4則主要用于保存輔助平面,例如Unicode 4.0中的第二輔助平面
            20000-20FFF - 21000-21FFF - 22000-22FFF - 23000-23FFF - 24000-24FFF - 25000-25FFF -   26000-26FFF - 27000-27FFF - 28000-28FFF - 29000-29FFF - 2A000-2AFFF - 2F000-2FFFF
            總共增加了16個輔助平面,由原先的65536個編碼擴展至將近100萬編碼。

            那么既然統一了編碼,如何兼容原先各國的文字編碼呢?
            這個時候就需要codepage了。
            什么是codepage?codepage就是各國的文字編碼和Unicode之間的映射表。
            比如簡體中文和Unicode的映射表就是CP936,點這里查看官方的映射表。

            以下是幾個常用的codepage,相應的修改上面的地址的數字即可。
          codepage=936 簡體中文GBK
          codepage=950 繁體中文BIG5
          codepage=437 美國/加拿大英語
          codepage=932 日文
          codepage=949 韓文
          codepage=866 俄文
          codepage=65001 unicode UFT-8

          最后一個65001,據個人理解,應該只是一個虛擬的映射表,實際只是一個算法而已。

          從936中隨意取一行,例如:
          0x9993 0x6ABD #CJK UNIFIED IDEOGRAPH
          前面的編碼是GBK的編碼,后面的是Unicode。
          通過查這張表,就能簡單的實現GBK和Unicode之間的轉換。

            現在明白了Unicode,那么UTF-8又是什么呢?又為什么會出現UTF-8呢?

            ASCII轉換成UCS-2,只是在編碼前插入一個0x0。用這些編碼,會包括一些控制符,比如 或 /,這在UNIX和一些C函數中,將會產生嚴重錯誤。因此可以肯定,UCS-2不適合作為Unicode的外部編碼。

            因此,才誕生了UTF-8。那么UTF-8是如何編碼的?又是如何解決UCS-2的問題呢?

          例:
          E4 BD A0        11100100 10111101 10100000
          這是“你”字的UTF-8編碼
          4F 60          01001111 01100000
          這是“你”的Unicode編碼

          按照UTF-8的編碼規則,分解如下:xxxx0100 xx111101 xx100000
          把除了x之外的數字拼接在一起,就變成“你”的Unicode編碼了。
          注意UTF-8的最前面3個1,表示整個UTF-8串是由3個字節構成的。
          經過UTF-8編碼之后,再也不會出現敏感字符了,因為最高位始終為1。

          以下是Unicode和UTF-8之間的轉換關系表:
          U-00000000 - U-0000007F: 0xxxxxxx
          U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
          U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
          U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
          U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
          U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

          Unicode編碼轉換到UTF-8,簡單的把Unicode字節流套到x中就變成UTF-8了。


          出處:http://www.ii8888.com/Article_View.asp?id=871

          posted @ 2006-11-03 10:07 狼愛上貍 閱讀(468) | 評論 (0)編輯 收藏

          Java中如何正確使用字體編碼


          在Java編程中,中文字體編碼難倒了不少程序員,如果抓住了影響Java中文顯示的幾個關鍵因素,問題將迎刃而解。
          Java是目前最流行的面向對象的編程語言之一,Java支持UTF-8、ISO-8859-1、GBK等各種字體編碼,可筆者發現Java中字體編碼的問題仍難倒了不少程序員,網上雖然也有不少關于在Java中如何正確顯示中文的文章,但都不夠全面,筆者特意總結如下。
          影響Java中字體編碼正確顯示的有幾個因素: 1)數據庫的連接方式; 2)網頁中使用的字體編碼; 3)數據庫里存放數據的字體編碼; 4)Java的缺省字體編碼。如果在編程中遇到不能正確顯示中文時,要先弄清楚以上幾項所使用的字體編碼,再分析找出原因,即可解決問題。
          眾所周知,JSP是Java的一種,和網頁有關,而網頁也有自己的中文編碼系統,所以JSP處理中文要比純Java的類文件更為麻煩。本文的測試數據庫是MySQL3.2,數據庫連接驅動是用org.gjt.mm.mysql.Driver,這里主要討論UTF-8和GBK的顯示( GB2312是GBK的一個子集,Java中可以使用GBK來代替GB系列)。我們先來研究JSP中字體編碼問題, 下面第一到第六點是針對JSP的(因為從數據庫里讀出中文數據與寫入中文數據有所區別,咱們分別說明,前三點是從讀取數據庫到顯示在網頁,后三點是從網頁輸入數據到存入數據庫),第七到第九點針對純Java的類文件。 以下rs表示ResultSet的一個實例,是執行Select語句之后產生的數據集。
          一、數據庫連接方式使用UTF-8
          在連接數據庫的驅動后面加上這句參數useUnicode=true&characterEncoding=
          UTF-8,例如jdbc:mysql://localhost/DBVF?autoReconnect=true&useUnicode=
          true&characterEncoding=UTF-8,從數據庫里讀出中文顯示在使用GBK的JSP的網頁里,如果數據庫里存放的字體編碼是UTF-8,在JSP中使用 str=new String(rs.getBytes(1),"UTF-8")或者str=rs.getString(1),可以正確顯示中文。如果數據庫里存放的是GBK數據,那么JSP中也要使用str=new String(rs.getBytes(1),"GBK")來顯示正確的中文。值得注意的是如果頁面使用UTF-8,數據庫里存放的是UTF-8,也可以用str=new String(rs.getBytes(1),"GBK")正確顯示中文。如果網頁是UTF-8,而數據庫里存放的是GBK,無法直接顯示中文,需要2步轉換, str=new String(rs.getBytes(1),"GBK"); 再str=new String(str.getBytes("UTF-8"),"GBK"),才可以正確顯示中文。
          二、數據庫連接方式使用GBK
          在連接數據庫的驅動后面加上這句參數useUnicode=true&characterEncoding=
          GBK,例如jdbc:mysql://localhost/DBVF?autoReconnect=true&UseUnicode=true&
          characterEncoding=GBK,從數據庫里讀出中文,顯示在使用GBK的JSP的網頁里,如果數據庫里存放的字體編碼是UTF-8,在JSP中一定要使用 str=new String(rs.getBytes(1),"UTF-8"),才正確顯示中文。如果數據庫里存放的是GBK數據,那么JSP中也要使用str=new String(rs.getBytes(1),"GBK") 或者直接使用str=rs.getString(1),即可顯示正確的中文。 如果網頁是UTF-8,而數據庫里存放的是GBK,只能用str=new String(rs.getString(1).getBytes("UTF-8"),"GBK")的方法來顯示中文; 如果網頁是UTF-8,而數據庫里存放的是UTF-8,可用str=new String(rs.getBytes(1),"GBK") 或者rs.getString(1)方法來顯示中文。
          三、使用缺省數據庫連接方式
          連接數據庫的驅動后面沒有這句參數useUnicode=&characterEncoding=,例如jdbc:mysql://localhost/DBVF?autoReconnect=true,沒有參數useUnicode=true&characterEncoding,表示使用默認的ISO-8895-1編碼。
          1. 從數據庫里讀出中文,顯示在GBK的網頁里。如果數據庫里存放的字體編碼是UTF-8,在JSP網頁中一定要使用語句 str=new String(rs.getBytes(1),"UTF-8") 或者str= new String(rs.getString(1).getBytes("ISO-8859-1"),"UTF-8"),才可正確顯示中文。如果數據庫里存放的是GBK數據,那么JSP中也要使用str=new String(rs.getBytes(1),"GBK")或str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK") 顯示正確的中文。
          2. 如果網頁是UTF-8,不能直接正確顯示GBK,需要2步轉換,str=new String(rs.getBytes(1),"GBK"),再str=new String(str.getBytes("UTF-8"),"GBK") 才可以正確顯示中文。如果數據庫里存的是UTF-8,直接用str=new String(rs.getBytes(1),"GBK")或者str=new String(rs.getString(1).getBytes("ISO-8859-1"),"GBK")就可以顯示中文了。
          以上是讀取數據庫里中文正確顯示在網頁上,下面三點是如何正確存入數據庫。
          四、數據庫連接方式使用UTF-8編碼
          JSP中要把網頁輸入的中文存入數據庫,通常有一個提交(Submit)的過程,是用str=request.getParameter("username"),然后執行update或者insert語句來存入數據庫。如何賦值給str很重要,而且這里中文輸入與網頁所使用的字體編碼有關。
          1、 網頁使用UTF-8,使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8")或者str= new String(request.getParameter("username").getBytes(),"UTF-8"),都可以使得存到數據庫里的數據是UTF-8編碼。
          2. 網頁使用GBK,使用str= new String(request.getParameter("username").getBytes(),"GBK"),那么存入數據庫的是UTF-8編碼。
          3. 值得注意的是使用UTF-8的數據庫連接方式不能存得GBK。
          五、數據庫連接方式使用GBK編碼
          1. 輸入使用GBK網頁,存到數據庫里是GBK的方法: str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new String(request.getParameter("username").getBytes(),"GBK")。
          2. 網頁使用GBK,想存入UTF-8到數據庫里,要分2步: 先str=new String(request.getParameter("username").getBytes(),"GBK"),再str=new String(str.getBytes("UTF-8"),"GBK")即可。
          3. 網頁使用UTF-8,而且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"GBK") 或者str= new String(request.getParameter("username").getBytes(),"UTF-8"),那么存到數據庫里的數據是UTF-8編碼。
          4. 網頁使用UTF-8,而且使用str= new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8"),那么存到數據庫里的數據是GBK編碼。
          六、數據庫連接方式使用缺省,即不使用參數useUnicode和characterEncoding
          1. 網頁使用GBK,如果使用str= request.getParameter("username")或者str= new String(request.getParameter("username").getBytes()),那么在數據庫里的數據是GBK碼。網頁使用UTF-8 和使用str= request.getParameter("username"),則存入數據庫是UTF-8編碼。
          2. 如果使用str= new String(request.getParameter("username").getBytes("ISO-8859-1")),那么根據網頁提供的字體編碼而存到數據庫里,比如是UTF-8的網頁,那么存到數據庫中就是UTF-8編碼,如果使用GBK網頁,那么存到數據庫里的字就是GBK編碼。
          3. 如果使用str= new String(request.getParameter("username").getBytes("UTF-8"),"UTF-8")這一種組合能存到正確的數據外,其他存到數據庫里的數據則都是亂碼或者錯誤碼。在這個UTF-8組合的特例中,網頁使用的是GBK,則存放到數據庫里就是GBK,網頁使用UTF-8,那么存到數據庫里的就是UTF-8。
          4. 網頁是GBK的要存得UTF-8,一定需要2步: company=new String(request.getParameter("company").getBytes(),"GBK")和company=new String(company.getBytes("UTF-8"))。
          5. 網頁是UTF-8的,不能存得GBK在數據庫里,一句話,改變數據庫連接方式不能存得GBK碼。
          以上所有的都是基于JSP網頁和數據庫交換數據,下面討論一下純JAVA編程下的字體編碼轉換。
          七、數據庫連接方式使用UTF-8編碼
          1. 數據庫里的中文是UTF-8,可以轉換為GBK,但不能把GBK存入數據庫。
          2. 數據庫是GBK,如果轉換為UTF-8,使用content=new String(rs.getBytes(2),"GBK")直接將content存入數據庫就可為UTF-8。
          八、數據庫連接方式使用GBK編碼
          1. 數據庫里的中文是UTF-8,如果轉換為GBK,使用content= new String(rs.getString(2).getBytes(),"UTF-8"),再直接使用update或者insert語句插入到數據庫,即存得GBK。如果使用content= new String(rs.getString(2).getBytes(),"GBK")或者content= new String(rs.getString(2).getBytes()),再存入數據庫即存得還是UTF-8編碼。
          2. 數據庫里的中文是GBK,如果轉換為UTF-8,使用content= new String(rs.getString(2).getBytes("UTF-8"))或者content= new String(rs.getString(2).getBytes("UTF-8"),"GBK"),再直接使用update或者insert語句插入到數據庫,即存得UTF-8。
          3. 如果某個String是GBK,要轉換為UTF-8,也是使用content= new String(GBKstr.getBytes("UTF-8"))或者content= new String(GBKstr.getBytes("UTF-8"),"GBK"); 如果某個String是UTF-8,要轉換為GBK,應該使用new String(UTFstr.getBytes("GBK"),"UTF-8")。
          九、數據庫連接方式使用缺省,即不跟參數
          1. str2=new String(GBKstr.getBytes("UTF-8"),"ISO-8859-1"),可以將數據庫里的GBK編碼轉換為UTF-8。
          2. 讀取UTF-8然后存入UTF-8,則用str1=new String(UTFstr.getBytes(),"ISO-8859-1")或者str1=new String(UTFstr.getBytes("GBK"),"ISO-8859-1")。
          3. 不能實現數據庫里的UTF-8轉換為GBK。
          如果采用UTF-8的數據庫連接方式或者缺省數據連接方式,那么無法將UTF-8轉為GBK;而GBK的數據庫連接方式可以實現UTF-8和GBK的相互轉換。建議大家采用GBK的數據連接方式。出處:http://www.ccw.com.cn/cio/research/info/htm2005/20051118_13GHU.asp

          posted @ 2006-11-01 16:43 狼愛上貍 閱讀(281) | 評論 (0)編輯 收藏

          如何得到漢字的unicode編碼?

          在jdk的bin目錄如:D:\j2sdk1.4.2\bin>
          在cmd模式下鍵入:
          D:\j2sdk1.4.2\bin>native2ascii
          然后打漢字,回車就會出現unicode的編碼了

          posted @ 2006-11-01 16:01 狼愛上貍 閱讀(540) | 評論 (0)編輯 收藏

          僅列出標題
          共38頁: First 上一頁 30 31 32 33 34 35 36 37 38 下一頁 
          主站蜘蛛池模板: 苏州市| 禄丰县| 鄂托克前旗| 太仓市| 丹凤县| 青神县| 广安市| 石嘴山市| 兴国县| 醴陵市| 个旧市| 微博| 镶黄旗| 竹山县| 岳西县| 万源市| 鱼台县| 永顺县| 彰武县| 昌图县| 榕江县| 城固县| 东海县| 久治县| 南阳市| 长岭县| 昂仁县| 原阳县| 教育| 来宾市| 土默特右旗| 昭苏县| 德州市| 佛冈县| 松桃| 平顺县| 长兴县| 中山市| 始兴县| 衡南县| 会理县|