<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    軟件是對質量的不懈追求

    #

    Linux編輯器vim中刪除行尾的^M

    Linux編輯器vim中刪除行尾的^M

    有時候,在 Linux 中使用打開曾在 Windows 中編輯過的文件時,會在行尾看到 ^M 字符。看起來總是感覺很別扭。
    刪除方法如下:
    在 Vim 的命令模式中輸入 :%s/^M$//g 后,回車即會自動刪除該文件中的所有 ^M 字符。
    注意: ^M 要用 Ctrl + v,  Ctrl + m 來輸入,M 后面的 $ 代表匹配行尾的內容,最后的 g 則表示每行中匹配到的內容都要置換。

    posted @ 2009-11-17 11:28 BlakeSu 閱讀(374) | 評論 (0)編輯 收藏

    進程的地址空間

    一個程序經過編譯連接后形成的地址空間是一個虛擬地址空間,而Linux在內存尋址時簡化了分段
    機制,使得虛擬地址與線性地址是一致的,比如程序test_wait.c代碼如下:
        #include <stdio.h>
        #include 
    <stdlib.h>                                                                                          
        #include 
    <unistd.h>
        
    int main(int argc, char **argv)
        {
                
    int i;
                unsigned 
    char *buff;
                buff 
    = (char *)malloc(sizeof(char)*1024);
                printf(
    "pid is :%d\n", getpid());
               
    for (i = 0; i < 60; i++) {
                       sleep(
    60);
               }  
               
    return 0;
       }
    經過編譯后形成的文件是test_wait,然后用命令objdump反匯編后如下(只取部分代碼):

    $ objdump -d test_wait
    test_wait:     file format elf32-i386
    Disassembly of section .init:
    08048304 <_init>:
     8048304:   55                       push   %ebp
     8048305:   89 e5                    mov    %esp,%ebp
     8048307:   53                       push   %ebx
     8048308:   83 ec 04                 sub    $0x4,%esp
     804830b:   e8 00 00 00 00           call   8048310 <_init+0xc>
     8048310:   5b                       pop    %ebx
     8048311:   81 c3 e4 1c 00 00        add    $0x1ce4,%ebx
     8048317:   8b 93 fc ff ff ff        mov    -0x4(%ebx),%edx
     804831d:   85 d2                    test   %edx,%edx
     8048301:   e8 2e 00 00 00           call   8048334 <__gmon_start__@plt>
     8048306:   e8 15 01 00 00           call   8048420

    可以看到,其中的地址就是虛擬地址,整個虛擬地址空間大小為3GB,再加上可以通過系統調用進入
    內核的1GB空間,于是每個進程可以擁有4GB的虛擬地址空間(也叫虛擬內存)。某個進程的虛擬地
    址空間可以通過/proc文件系統看到:
    $ ./test_wait
    pid is :9840
    重新開一個終端:

    cat /proc/9840/maps
    08048000-08049000 r-xp 00000000 08:01 212891     /home/chen/mem/test_wait
    08049000-0804a000 r--p 00000000 08:01 212891     /home/chen/mem/test_wait
    0804a000-0804b000 rw-p 00001000 08:01 212891     /home/chen/mem/test_wait
    096d5000-096f6000 rw-p 096d5000 00:00 0          [heap]
    b7dee000-b7def000 rw-p b7dee000 00:00 0
    b7def000-b7f47000 r-xp 00000000 08:01 409724     /lib/tls/i686/cmov/libc-2.8.90.so
    b7f47000-b7f49000 r--p 00158000 08:01 409724     /lib/tls/i686/cmov/libc-2.8.90.so
    b7f49000-b7f4a000 rw-p 0015a000 08:01 409724     /lib/tls/i686/cmov/libc-2.8.90.so
    b7f4a000-b7f4d000 rw-p b7f4a000 00:00 0
    b7f59000-b7f5c000 rw-p b7f59000 00:00 0
    b7f5c000-b7f76000 r-xp 00000000 08:01 392460     /lib/ld-2.8.90.so
    b7f76000-b7f77000 r-xp b7f76000 00:00 0          [vdso]
    b7f77000-b7f78000 r--p 0001a000 08:01 392460     /lib/ld-2.8.90.so
    b7f78000-b7f79000 rw-p 0001b000 08:01 392460     /lib/ld-2.8.90.so
    bf964000-bf979000 rw-p bffeb000 00:00 0          [stack]

    關于此文件的詳細信息可以參看:
    http://www.kerneltravel.net/?p=287
    由上面的信息可以看到
    08048000-08049000地址段的標志是r-xp(讀,執行)是代碼段,
    08049000-0804a000的標志是rw-p(讀寫)是數據段
    096d5000-096f6000是堆也叫空洞,只有當程序中調用malloc()申請空間時才有堆段。
    bf964000-bf979000 是堆棧段
    這樣我們可以看到進程的用戶空間的分配了。如下圖:
     
     

    可以看出代碼段在最低地址依次往上是數據段,空洞、堆棧段在最高地址,棧指針向下移動。
    進程的虛擬地址在保存在內核中的task_struct(PCB)結構中,定義如下:
    struct task_struct { //進程結構體
    //……
    struct mm_struct *mm;//描述進程的整個用戶空間
    }
    而stuct mm_struct 結構中包含了虛擬空間的結構體字段
    mmap(struct vm_area_struct * mmap),所以可以通過模塊編程來查看進程的虛擬地址空間。
    關于模塊編程可以看這里:
    http://www.kerneltravel.net/?p=80,程序清單如下:


     #include <linux/module.h>                                                                                     
     #include 
    <linux/init.h>
     #include 
    <linux/interrupt.h>
     #include 
    <linux/sched.h>
     
    static int pid;
     module_param(pid,
    int,0644);
     
    static int __init memtest_init(void)
     {
             
    struct task_struct *p;
             
    struct vm_area_struct *temp;
             printk(
    "My module worked!\n");
             p 
    = find_task_by_vpid(pid);
             temp 
    = p->mm->mmap;
             
    while(temp) {
                     printk(
    "start:%p\tend:%p\n", (unsigned long *)temp->vm_start,
     (unsigned 
    long *)temp->vm_end);
                     temp 
    = temp->vm_next;
             }  
             
    return 0;
     }
     
    static void __exit memtest_exit(void)
     {
             printk(
    "Unloading my module.\n");
             
    return;
     }
     module_init(memtest_init);
     module_exit(memtest_exit);
     MODULE_LICENSE(
    "GPL");  

    編譯模塊,運行剛才的程序test_wait,然后帶參數插入模塊,如下:
    $ ./test_wait &
    pid is :9413
    $ sudo insmod mem.ko pid=9413
    [ 2690.715913] My module worked!
    [ 2690.715992] start:08048000    end:08049000
    [ 2690.716005] start:08049000    end:0804a000
    [ 2690.717029] start:0804a000    end:0804b000
    [ 2690.717065] start:096d5000    end:096f6000
    [ 2690.717096] start:b7dee000    end:b7def000
    [ 2690.717126] start:b7def000     end:b7f47000
    [ 2690.717157] start:b7f47000     end:b7f49000
    [ 2690.717187] start:b7f49000     end:b7f4a000
    [ 2690.717217] start:b7f4a000     end:b7f4d000
    [ 2690.717248] start:b7f59000     end:b7f5c000
    [ 2690.717304] start:b7f5c000     end:b7f76000
    [ 2690.717334] start:b7f76000     end:b7f77000
    [ 2690.717364] start:b7f77000     end:b7f78000
    [ 2690.717395] start:b7f78000     end:b7f79000
    [ 2690.717425] start:bf964000     end:bf979000
    可以看出和剛才/proc文件系統中的地址是一樣的。
    在任意一個時刻,一個CPU只有一個進程在運行,所以雖然有時候很多進程的虛擬地址值有相同的
    ,但是由于每次只有一個進程運行,在當某個進程運行時cpu就將其虛擬地址也切換進來,這樣就保
    證了每個進程都擁有4GB的地址空間。

    posted @ 2009-11-16 13:15 BlakeSu 閱讀(434) | 評論 (2)編輯 收藏

    LINUX調優方法總結

    ----------------------------------------------------------------------------------------------------------------------------
    大 多數 Linux 發布版都定義了適當的緩沖區和其他 Transmission Control Protocol(TCP)參數。可以修改這些參數來分配更多的內存,從而改進網絡性能。設置內核參數的方法是通過 proc 接口,也就是通過讀寫 /proc 中的值。幸運的是,sysctl 可以讀取 /etc/sysctl.conf 中的值并根據需要填充 /proc,這樣就能夠更輕松地管理這些參數。清單 2 展示在互聯網服務器上應用于 Internet 服務器的一些比較激進的網絡設置。
    # Use TCP syncookies when needed
    net.ipv4.tcp_syncookies = 1
    # Enable TCP window scaling
    net.ipv4.tcp_window_scaling: = 1
    # Increase TCP max buffer size
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    # Increase Linux autotuning TCP buffer limits
    net.ipv4.tcp_rmem = 4096 87380 16777216
    net.ipv4.tcp_wmem = 4096 65536 16777216
    # Increase number of ports available
    net.ipv4.ip_local_port_range = 1024 65000
     
    將這些設置添加到 /etc/sysctl.conf 的現有內容中。第一個設置啟用 TCP SYN cookie。當從客戶機發來新的 TCP 連接時,數據包設置了 SYN 位,服務器就為這個半開的連接創建一個條目,并用一個 SYN-ACK 數據包進行響應。在正常操作中,遠程客戶機用一個 ACK 數據包進行響應,這會使半開的連接轉換為全開的。有一種稱為 SYN 泛濫(SYN flood) 的網絡攻擊,它使 ACK 數據包無法返回,導致服務器用光內存空間,無法處理到來的連接。SYN cookie 特性可以識別出這種情況,并使用一種優雅的方法保留隊列中的空間(細節參見 參考資料 一節)。大多數系統都默認啟用這個特性,但是確保配置這個特性更可靠。
    啟用 TCP 窗口伸縮使客戶機能夠以更高的速度下載數據。TCP 允許在未從遠程端收到確認的情況下發送多個數據包,默認設置是最多 64 KB,在與延遲比較大的遠程客戶機進行通信時這個設置可能不夠。窗口伸縮會在頭中啟用更多的位,從而增加窗口大小。
    后面四個配置項增加 TCP 發送和接收緩沖區。這使應用程序可以更快地丟掉它的數據,從而為另一個請求服務。還可以強化遠程客戶機在服務器繁忙時發送數據的能力。
    最后一個配置項增加可用的本地端口數量,這樣就增加了可以同時服務的最大連接數量。
    在下一次引導系統時,或者下一次運行 sysctl -p /etc/sysctl.conf 時,這些設置就會生效。
     
    ----------------------------------------------------------------------------------------------------------------------------
    磁盤子系統的調優
    磁盤在 LAMP 架構中扮演著重要的角色。靜態文件、模板和代碼都來自磁盤,組成數據庫的數據表和索引也來自磁盤。對磁盤的許多調優(尤其是對于數據庫)集中于避免磁盤訪問,因為磁盤訪問的延遲相當高。因此,花一些時間對磁盤硬件進行優化是有意義的。
    首先要做的是,確保在文件系統上禁用 atime 日志記錄特性。atime 是最近訪問文件的時間,每當訪問文件時,底層文件系統必須記錄這個時間戳。因為系統管理員很少使用 atime,禁用它可以減少磁盤訪問時間。禁用這個特性的方法是,在 /etc/fstab 的第四列中添加 noatime 選項。

    演示如何啟用 noatime 的 fstab 示例
                   
    /dev/VolGroup00/LogVol00 /                      ext3    defaults,noatime        1 1
    LABEL=/boot             /boot                   ext3    defaults,noatime        1 2
    devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
    tmpfs                   /dev/shm                tmpfs   defaults        0 0
    proc                    /proc                   proc    defaults        0 0
    sysfs                   /sys                    sysfs   defaults        0 0
    LABEL=SWAP-hdb2         swap                    swap    defaults        0 0
    LABEL=SWAP-hda3         swap                    swap    defaults        0 0
     

    有多種磁盤硬件組合,而且 Linux 不一定能夠探測出訪問磁盤的最佳方式。可以使用 hdparm 命令查明和設置用來訪問 IDE 磁盤的方法。hdparm -t /path/to/device 執行速度測試,可以將這個測試結果作為性能基準。為了使結果盡可能準確,在運行這個命令時系統應該是空閑的。
    在 /dev/hd 上執行的速度測試
                   
    # hdparm -t /dev/hda
    /dev/hda:
     Timing buffered disk reads:  182 MB in  3.02 seconds =  60.31 MB/sec
     

     hdparm 的常用選項
    選項 描述
    -vi 向磁盤查詢它支持的設置以及它正在使用的設置。
    -c 查詢/啟用 (E)IDE 32 位 I/O 支持。hdparm -c 1 /dev/hda 啟用這個設置。
    -m 查詢/設置每中斷多扇區模式。如果設置大于零,設置值就是每個中斷可以傳輸的最大扇區數量。
    -d 1 -X 啟用直接內存訪問(DMA)傳輸并設置 IDE 傳輸模式。hdparm 手冊頁詳細說明了在 -X 后面可以設置的數字。只有在 -vi 說明目前并未使用最快速的模式的情況下,才需要進行這個設置。

    不幸的是,對于 Fiber Channel and Small Computer Systems Interface(SCSI)系統,調優依賴于具體的驅動器。
    必須將有幫助的設置添加到啟動腳本中,比如 rc.local。

    ----------------------------------------------------------------------------------------------------------------------------
    TCP/IP子系統的調優
    所有的TCP/IP調優參數都位于/proc/sys/net/目錄. 例如, 下面是最重要的一些調優參數, 后面是它們的含義:
      1. /proc/sys/net/core/rmem_max — 最大的TCP數據接收緩沖
      2. /proc/sys/net/core/wmem_max — 最大的TCP數據發送緩沖
      3. /proc/sys/net/ipv4/tcp_timestamps — 時間戳在(請參考RFC 1323)TCP的包頭增加12個字節
      4. /proc/sys/net/ipv4/tcp_sack — 有選擇的應答
      5. /proc/sys/net/ipv4/tcp_window_scaling — 支持更大的TCP窗口. 如果TCP窗口最大超過65535(64K), 必須設置該數值為1
      6. rmem_default — 默認的接收窗口大小
      7. rmem_max — 接收窗口的最大大小
      8. wmem_default — 默認的發送窗口大小
      9. wmem_max — 發送窗口的最大大小
      /proc目錄下的所有內容都是臨時性的, 所以重啟動系統后任何修改都會丟失.
      建議在系統啟動時自動修改TCP/IP參數:
      把下面代碼增加到/etc/rc.local文件, 然后保存文件, 系統重新引導的時候會自動修改下面的TCP/IP參數:
      echo 256960 > /proc/sys/net/core/rmem_default
      echo 256960 > /proc/sys/net/core/rmem_max
      echo 256960 > /proc/sys/net/core/wmem_default
      echo 256960 > /proc/sys/net/core/wmem_max
      echo 0 > /proc/sys/net/ipv4/tcp_timestamps
      echo 1 > /proc/sys/net/ipv4/tcp_sack
      echo 1 > /proc/sys/net/ipv4/tcp_window_scaling
      TCP/IP參數都是自解釋的, TCP窗口大小設置為256960, 禁止TCP的時間戳(取消在每個數據包的頭中增加12字節), 支持更大的TCP窗口和TCP有選擇的應答.
      上面數值的設定是根據互連網連接和最大帶寬/延遲率來決定.
      注: 上面實例中的數值可以實際應用, 但它只包含了一部分參數.
      另外一個方法: 使用 /etc/sysctl.conf 在系統啟動時將參數配置成您所設置的值:
      net.core.rmem_default = 256960
      net.core.rmem_max = 256960
      net.core.wmem_default = 256960
      net.core.wmem_max = 256960
      net.ipv4.tcp_timestamps = 0
      net.ipv4.tcp_sack =1
      net.ipv4.tcp_window_scaling = 1
    ----------------------------------------------------------------------------------------------------------------------------
    文件子系統的調優

    ulimit -a 用來顯示當前的各種用戶進程限制。
    Linux對于每個用戶,系統限制其最大進程數。為提高性能,可以根據設備資源情況,
    設置各linux 用戶的最大進程數,下面我把某linux用戶的最大進程數設為10000個:
        ulimit -u 10000
        對于需要做許多 socket 連接并使它們處于打開狀態的 Java 應用程序而言,
        最好通過使用 ulimit -n xx 修改每個進程可打開的文件數,缺省值是 1024。
        ulimit -n 4096 將每個進程可以打開的文件數目加大到4096,缺省為1024
        其他建議設置成無限制(unlimited)的一些重要設置是:
        數據段長度:ulimit -d unlimited
        最大內存大小:ulimit -m unlimited
        堆棧大小:ulimit -s unlimited
       CPU 時間:ulimit -t unlimited
        虛擬內存:ulimit -v unlimited
        暫時地,適用于通過 ulimit 命令登錄 shell 會話期間。
        永久地,通過將一個相應的 ulimit 語句添加到由登錄 shell 讀取的文件中, 即特定于 shell 的用戶資源文件,如:
    1)、解除 Linux 系統的最大進程數和最大文件打開數限制:
           vi /etc/security/limits.conf
           # 添加如下的行
           * soft noproc 11000
           * hard noproc 11000
           * soft nofile 4100
           * hard nofile 4100
       說明:* 代表針對所有用戶
                       noproc 是代表最大進程數
                       nofile 是代表最大文件打開數
    2)、讓 SSH 接受 Login 程式的登入,方便在 ssh 客戶端查看 ulimit -a 資源限制:
           a、vi /etc/ssh/sshd_config
             把 UserLogin 的值改為 yes,并把 # 注釋去掉
           b、重啟 sshd 服務:
                 /etc/init.d/sshd restart
    3)、修改所有 linux 用戶的環境變量文件:
    vi /etc/profile
    ulimit -u 10000
    ulimit -n 4096
    ulimit -d unlimited
    ulimit -m unlimited
    ulimit -s unlimited
    ulimit -t unlimited
    ulimit -v unlimited
     
    /**************************************
    有時候在程序里面需要打開多個文件,進行分析,系統一般默認數量是1024,(用ulimit -a可以看到)對于正常使用是夠了,但是對于程序來講,就太少了。
    修改2個文件。
    1./etc/security/limits.conf
    vi /etc/security/limits.conf
    加上:
    * soft nofile 8192
    * hard nofile 20480
    2./etc/pam.d/login
    session required /lib/security/pam_limits.so
    **********
    另外確保/etc/pam.d/system-auth文件有下面內容
    session required /lib/security/$ISA/pam_limits.so
    這一行確保系統會執行這個限制。
    ***********
    3.一般用戶的.bash_profile
    #ulimit -n 1024
    重新登陸ok

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

    內存子系統的調優
      內存子系統的調優不是很容易,需要不停地監測來保證內存的改變不會對服務器的其他子系統造成負面影響。如果要改變虛擬內存參數(在/proc/sys/vm),建議您每次只改變一個參數然后監測效果。對與虛擬內存的調整包括以下幾個項目:
      配置Linux內核如何更新dirty buffers到磁盤。磁盤緩沖區用于暫存磁盤的數據。相對于內存來講,磁盤緩沖區的速度很慢。因此,如果服務器使用這類內存,性能會成問題。當緩沖區內 的數據完全dirty,使用:sysctl -w vm.bdflush="30 500 0 0 500 3000 60 20 0"
      vm.bdflush有9個參數,但是建議您只改變其中的3個:
      1 nfract, 為排隊寫入磁盤前,bdflush daemon允許的緩沖區最大百分比
    2 ndirty, 為bdflush即刻寫的最大緩沖區的值。如果這個值很大,bdflush需要更多的時間完成磁盤的數據更新。
      7 nfract_sync, 發生同步前,緩沖區變dirty的最大百分比
      配置kswapd daemon,指定Linux的內存頁數量
      sysctl -w vm.kswapd="1024 32 64"
      三個參數的描述如下:
    – tries_base 相當于內核每次所的“頁”的數量的四倍。對于有很多交換信息的系統,增加這個值可以改進性能。
    – tries_min 是每次kswapd swaps出去的pages的最小數量。
    – swap_cluster 是kswapd 即刻寫如的pages數量。數值小,會提高磁盤I/O的性能;數值大可能也會對請求隊列產生負面影響。
      如果要對這些參數進行改動,請使用工具vmstat檢查對性能的影響。其它可以改進性能的虛擬內存參數為:
      _ buffermem
    _ freepages
    _ overcommit_memory
    _ page-cluster
    _ pagecache
    _ pagetable_cache

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

    網絡子系統的調優
      操作系統安裝完畢,就要對網絡子系統進行調優。對其它子系統的影響:影響CPU利用率,尤其在有大量TCP連接、塊尺寸又非常小時,內存的使用會明顯增加。
      如何預防性能下降
      如下的sysctl命令用于改變安全設置,但是它也可以防止網絡性能的下降。這些命令被設置為缺省值。
      ◆關閉如下參數可以防止黑客對服務器IP地址的攻擊
    sysctl -w net.ipv4.conf.eth0.accept_source_route=0
    sysctl -w net.ipv4.conf.lo.accept_source_route=0
    sysctl -w net.ipv4.conf.default.accept_source_route=0
    sysctl -w net.ipv4.conf.all.accept_source_route=0
    ◆開啟TCP SYN cookies,保護服務器避免受syn-flood攻擊,包括服務取決denial-of-service (DoS) 或者分布式服務拒絕distributed denial-of-service (DDoS) (僅適用Red Hat Enterprise Linux AS)
    sysctl -w net.ipv4.tcp_syncookies=1
    ◆以下命令使服務器忽略來自被列入網關的服務器的重定向。因重定向可以被用來進行攻擊,所以我們只接受有可靠來源的重定向。
    sysctl -w net.ipv4.conf.eth0.secure_redirects=1
    sysctl -w net.ipv4.conf.lo.secure_redirects=1
    sysctl -w net.ipv4.conf.default.secure_redirects=1
    sysctl -w net.ipv4.conf.all.secure_redirects=1

    另外,你可以配置接受或拒絕任何ICMP重定向。ICMP重定向是器傳輸信息的機制。比如,當網關接收到來自所接網絡主機的 Internet數據報時,網關可以發送重定向信息到一臺主機。網關檢查路由表獲得下一個網關的地址,第二個網關將數據報路由到目標網絡.關閉這些重定向 得命令如下:
    sysctl -w net.ipv4.conf.eth0.accept_redirects=0
    sysctl -w net.ipv4.conf.lo.accept_redirects=0
    sysctl -w net.ipv4.conf.default.accept_redirects=0
    sysctl -w net.ipv4.conf.all.accept_redirects=0
    ◆如果這個服務器不是一臺路由器,那么它不會發送重定向,所以可以關閉該功能:
    sysctl -w net.ipv4.conf.eth0.send_redirects=0
    sysctl -w net.ipv4.conf.lo.send_redirects=0
    sysctl -w net.ipv4.conf.default.send_redirects=0
    sysctl -w net.ipv4.conf.all.send_redirects=0
    ◆配置服務器拒絕接受廣播風暴或者smurf 攻擊attacks:
    sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1
    ◆忽略所有icmp包或者pings:
    sysctl -w net.ipv4.icmp_echo_ignore_all=1
    ◆有些路由器針對廣播禎發送無效的回應,每個都產生警告并在內核產生日志.這些回應可以被忽略:
    sysctl -w net.ipv4.icmp_ignore_bogus_error_responses=1
    針對TCP和UDP的調優
      下邊的命令用來對連接數量非常大的服務器進行調優.
      ◆對于同時支持很多連接的服務器,新的連接可以重新使用TIME-WAIT套接字. 這對于Web服務器非常有效:
    sysctl -w net.ipv4.tcp_tw_reuse=1
    如果你使用該命令,還要啟動TIME-WAIT 套接字狀態的快速循環功能:
    sysctl -w net.ipv4.tcp_tw_recycle=1
    圖Figure 10-7顯示出將這些功能啟用,連接數量明顯降低.因為每個TCP傳輸都包含遠程客戶端的信息緩存,所以有利于提高性能.緩存中存放round-trip時間、最大segment大小、擁塞窗口的信息。
    ◆ 參數tcp_fin_timeout 是套接字關閉時,保持FIN-WAIT-2狀態的時間。一個TCP連接以three-segment SYN序列開始, 以three-segment FIN序列結束.均不保留數據.通過改變tcp_fin_timeout的值, 從FIN序列到內存可以空閑出來處理新連接的時間縮短了,使性能得到改進.改變這個值的前要經過認真的監測,避免因為死套接字造成內存溢出.
    sysctl -w net.ipv4.tcp_fin_timeout=30
    ◆服務器的一個問題是,同一時刻的大量TCP連接里有很多的連接被打開但是沒有使用. TCP的keepalive功能檢測到這些連接,缺省情況下,在2小時之后丟掉. 2個小時的可能導致內存過度使用,降低性能.因此改成1800秒(30分鐘)是個更好的選擇:
    sysctl -w net.ipv4.tcp_keepalive_time=1800
    ◆對于所有的隊列,設置最大系統發送緩存(wmem) 和接收緩存(rmem)到8MB
    sysctl -w net.ipv4.core.wmem_max=8388608
    sysctl -w net.ipv4.core.rmem_max=8388608
    這些設置指定了創建TCP套接字時為其分配的內存容量. 另外,使用如下命令發送和接收緩存.該命令設定了三個值:最小值、初始值和最大值:
    sysctl -w net.ipv4.tcp_rmem="4096 87380 8388608"
    sysclt -w net.ipv4.tcp.wmem="4096 87380 8388608"
    第三個值必須小于或等于wmem_max和rmem_max。
      ◆(SUSE LINUX Enterprise Server適用) 通過保留路徑驗證來源數據包。缺省情況下,路由器轉發所有的數據包,即便是明顯的異常網絡流量。通過啟動和是的過濾功能,丟掉這些數據包:
    sysctl -w net.ipv4.conf.eth0.rp_filter=1
    sysctl -w net.ipv4.conf.lo.rp_filter=1
    sysctl -w net.ipv4.conf.default.rp_filter=1
    sysctl -w net.ipv4.conf.all.rp_filter=1
    ◆當服務器負載繁重或者是有很多客戶端都是超長延時的連接故障,可能會導致half-open連接數量的增加。這對于Web服務器很來講很平 常,尤其有很多撥號客戶時.這些half-open連接保存在 backlog connections 隊列中.將這個值最少設置為4096 (缺省為1024). 即便是服務器不接收這類連接,設置這個值還能防止受到denial-of-service (syn-flood)的攻擊.
    sysctl -w net.ipv4.tcp_max_syn_backlog=4096
    ◆設置ipfrag參數,尤其是NFS和Samba服務器。這里,我們可以設置用于重新組合IP碎片的最大、最小內存。當ipfrag_high_thresh值被指派,碎片會被丟棄直到達到ipfrag_low_thres值。
    當TCP數據包傳輸發生錯誤時,開始碎片整理。有效的數據包保留在內存,同時損壞的數據包被轉發。例如,設置可用內存范圍從256 MB到384 MB
    sysctl -w net.ipv4.ipfrag_low_thresh=262144
    sysctl -w net.ipv4.ipfrag_high_thresh=393216
    ----------------------------------------------------------------------------------------------------------------------------
    網絡安全設置:
    TCP SYN Flood 攻擊
    TCP SYN Flood是一種常見,而且有效的遠端(遠程)拒絕服務(Denial of Service)攻擊方式,它透過一定的操作破壞TCP三次握手建立正常連接,佔用並耗費系統資源,使得提供TCP服務的主機系統無法正常工作。 由於TCP SYN Flood是透過網路底層對服務器Server進行攻擊的,它可以在任意改變自己的網路IP地址的同時,不被網路上的其他設備所識別,這樣就給防範網路犯 罪部門追查犯罪來源造成很大的困難。
    系統檢查
      一般情況下,可以一些簡單步驟進行檢查,來判斷系統是否正在遭受TCP SYN Flood攻擊。
      1、 服務端無法提供正常的TCP服務。連接請求被拒絕或超時。
      2、透過 netstat -an 命令檢查系統,發現有大量的SYN_RECV連接狀態。
        3. iptables的設置,引用自CU
      防止同步包洪水(Sync Flood)
      # iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
      也有人寫作
      #iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
      --limit 1/s 限制syn并發數每秒1次,可以根據自己的需要修改
    防止各種端口掃描
      # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
      Ping洪水攻擊(Ping of Death)
      # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
     

    ----------------------------------------------------------------------------------------------------------------------------
    暫定步驟:
    修改/etc/profile文件,加入:
    ulimit -u 10240
    ulimit -n 4096
    ulimit -d unlimited
    ulimit -m unlimited
    ulimit -s unlimited
    ulimit -t unlimited
    ulimit -v unlimited
    修改/etc/rc.d/rc.local,加入:
    echo ‘131072′ > /proc/sys/fs/file-max
    echo ‘131072′ > /proc/sys/fs/inode-max
    (1G內存值修改成:65535 2G內存值修改成:131072    4G內存值修改成:262144)
    修改/etc/sysctl.conf文件,加入:
    net.core.rmem_default = 8388608
    net.core.rmem_max = 8388608
    net.core.wmem_default = 8388608
    net.core.wmem_max = 8388608
    net.ipv4.tcp_timestamps = 0
    net.ipv4.tcp_sack =1
    net.ipv4.tcp_window_scaling = 1
    net.core.netdev_max_backlog=3000
    #Modify i-node
    sys.fs.file-max= 65535
    sys.fs.inode-max= 65535
    #Set System Memory
    vm.bdflush="30 500 0 0 500 3000 60 20 0"
    vm.kswapd="1024 32 64"
    #Disable HackAttack!
    net.ipv4.conf.eth0.accept_source_route=0
    net.ipv4.conf.lo.accept_source_route=0
    net.ipv4.conf.default.accept_source_route=0
    net.ipv4.conf.all.accept_source_route=0
    net.ipv4.conf.lo.accept_redirects=0
    net.ipv4.conf.all.accept_redirects=0
    net.ipv4.conf.eth0.accept_redirects=0
    net.ipv4.conf.default.accept_redirects=0
    net.ipv4.conf.lo.secure_redirects=0
    net.ipv4.conf.all.secure_redirects=0
    net.ipv4.conf.eth0.secure_redirects=0
    net.ipv4.conf.default.secure_redirects=0
    net.ipv4.conf.eth0.send_redirects=0
    net.ipv4.conf.lo.send_redirects=0
    net.ipv4.conf.default.send_redirects=0
    net.ipv4.conf.all.send_redirects=0
    net.ipv4.tcp_syncookies=1
    net.ipv4.icmp_echo_ignore_broadcasts=1
    net.ipv4.icmp_ignore_bogus_error_responses=1
    #Web Servers
    net.ipv4.tcp_tw_reuse=1
    net.ipv4.tcp_tw_recycle=1
    net.ipv4.tcp_fin_timeout=30
    net.ipv4.tcp_keepalive_time=1800
    net.ipv4.core.wmem_max=16777216
    net.ipv4.core.rmem_max=16777216
    net.ipv4.tcp_rmem="4096 87380 8388608"
    net.ipv4.tcp.wmem="4096 87380 8388608"
    net.ipv4.tcp_max_syn_backlog=8192
    防火墻安全:
    iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
    也有人寫作
    iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
    --limit 1/s 限制syn并發數每秒1次,可以根據自己的需要修改
    防止各種端口掃描
    iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
    Ping洪水攻擊(Ping of Death)
    iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
    備注說明:(相對比較激進的網絡參數調整)
    # Use TCP syncookies when needed
    net.ipv4.tcp_syncookies = 1
    # Enable TCP window scaling
    net.ipv4.tcp_window_scaling: = 1
    # Increase TCP max buffer size
    net.core.rmem_max = 16777216
    net.core.wmem_max = 16777216
    # Increase Linux autotuning TCP buffer limits
    net.ipv4.tcp_rmem = 4096 87380 8388608
    net.ipv4.tcp_wmem = 4096 65536 8388608
    # Increase number of ports available
    net.ipv4.ip_local_port_range = 1024 65000
    ----------------------------------------------------------------------------------------------------------------------------
    LINUX安全設置步驟:
    刪除所有那些不能在你系統上使用的默認用戶和組賬戶:  lp,sync,shutdown,halt, news, uucp, operator, games, gopher
    ROOT自動從shell注銷
    編輯你的配置文件”vi /etc/profile”,在某個地方加入如下行,
    “HISTFILESIZE=”
    TMOUT=3600
    我們為變量”TMOUT=”輸入的這個值使用秒表示的、代表一個小時(60*60=3600秒)。如果你將此行加入你的 “/etc/profile” 文件,那么在一小時的非活動狀態之后將要系統里的所有用戶自動注銷。你可以在用戶私人的”.bashrc”文件里面
    設置這個變量,可以在一個確定的時間以后自動注銷他們。
    禁止并且卸載所有沒有用的服務
    你必須禁止別切卸載所有你不用的的服務,那樣的話,你就能少擔心一些。看看你的”/etc/inetd.conf”文件, 用注釋的方法禁用(在一行的開始加個#),然后給inetd進程發送一個SIGHUP命令去更新到當前的”inetd.conf”文件。這樣做:
    第一步把”/etc/inetd.conf”更改許可權限成600,那樣的話,就只有root可以讀和寫。
    [Root@kapil /]# chmod 600 /etc/inetd.conf
    第二步確保”/etc/inetd.conf”的所有者是root。
    第 三步編輯inetd.conf文件(vi /etc/inetd.conf),并且禁止一些服務,就像:ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger, auth等等,除非你打算用它。關閉這些服務就降低一些風險。
    第四步給你的inetd進程發送一個HUP信號[root@kapil /]# killall -HUP inetd
    第五步設置”/etc/inetd.conf”文件為不可更改,使用 chattr 命令,這樣的話,沒人能修改那個文件。*簡單的設置文件為不可更改,執行如下命令:
    [root@kapil /]# chattr +i /etc/inetd.conf
    這將防止對”inetd.conf”文件的任何更改(意外的更改或者其他更改)。只有超級用戶root能設置或者清除這個文件屬性。修改inetd.conf  *簡單的取消不可更改的設置,執行如下命令:
    [root@kapil /]# chattr -i /etc/inetd.conf
    免疫”/etc/services”文件
    你必須免疫 “/etc/services” 文件,防止未經授權的刪除、增加服務。
    免疫 “/etc/services” 文件,使用命令:
    [root@kapil /]# chattr +i /etc/services
    禁止Control-Alt-Deletc鍵盤關機命令
    在你的”/etc/inittab”文件里面注釋掉如下的行(用一個”#”)。
    這樣做,編輯inittab文件(vi /etc/inittab),更換:
    ca::ctrlaltdel:/sbin/shutdown -t3 -r now
    讀入:
    #ca::ctrlaltdel:/sbin/shutdown -t3 -r now
    現在,按照如下提示輸入,讓更改生效:
    [root@kapil /]# /sbin/init q
    為腳本文件整理”/etc/rc.d/init.d”下的權限
    整理腳本文件的許可權限,可靠的開始和結束所有你需要在引導時運行的常態進程,這樣做:
    [root@kapil/]# chmod -R 700 /etc/rc.d/init.d/*
    這意味著只有root可以被允許讀,寫,和執行目錄里面的腳本文件。
    隱藏你的系統信息
    默認狀態下,當你登錄到linux機器時,他告訴你Linux分布商的名字,版本,核心版本和服務器名字。這對一個駭客來說從你的服務器得到這些信息足夠了以必須立刻用一個”Login:”提示符提示用戶。
    第一步
    這樣做,編輯”/etc/rc.d/rc.local”文件,放置”#”在如下行的前面。
    # This will overwrite /etc/issue at every boot.  So, make any changes you
    # want to make to /etc/issue here or you will lose them when you reboot.
    #echo “” >; /etc/issue
    #echo “$R” >;>; /etc/issue
    #echo “Kernel $(uname -r) on $a $(uname -m)” >;>; /etc/issue
    #
    #cp -f /etc/issue /etc/issue.net
    #echo >;>; /etc/issue
    第二步
    然后,刪除如下文件:在”/etc/”目錄下的”issue.net” 和 “issue”:
    [root@kapil /]# rm -f /etc/issue
    [root@kapil /]# rm -f /etc/issue.net
    禁止未用的 SUID/SGID 程序
    一個常規用戶如果設置為SUID root,將能夠作為root運行程序。一個系統管理員必須最小化使用這些 SUID/GUID程序, 而且禁止那些不需要的程序。
    第1步
    從root擁有的程序里發現所有有`s’ 位的程序,用此命令:
    [root@kapil]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls -lg {} \;
    * 在被選中的程序上禁止suid 位,鍵入如下命令:
    [root@kapil /]# chmod a-s [program]
    關閉ipv6
    vi /etc/modprobe.conf,在文件中添加以下兩行
    alias net-pf-10 off
    alias ipv6 off
    ----------------------------------------------------------------------------------------------------------------------------

    posted @ 2009-11-15 13:02 BlakeSu 閱讀(302) | 評論 (0)編輯 收藏

    剖析Linux系統中硬鏈接與軟鏈接的區別

    首先要弄清楚,在Linux系統中,內核為每一個新創建的文件分配一個Inode(索引結點),每個文件都有一個惟一的inode號。文件屬性保存在索引結點里,在訪問文件時,索引結點被復制到內存在,從而實現文件的快速訪問。

    鏈接是一種在共享文件和訪問它的用戶的若干目錄項之間建立聯系的一種方法。Linux中包括兩種鏈接:硬鏈接(Hard Link)和軟鏈接(Soft Link),軟鏈接又稱為符號鏈接(Symbolic link)。

    一、硬鏈接

    硬鏈接說白了是一個指針,指向文件索引節點,系統并不為它重新分配inode。可以用:ln命令來建立硬鏈接。語法:

    ln [options] existingfile newfile
    ln[options] existingfile-list directory

    用 法: 第一種:為”existingfile”創建硬鏈接,文件名為”newfile”。第二種:在”directory”目錄中, 為”existingfile-list”中包含的所有文件創建一個同名的硬鏈接。常用可選[options] –f 無論”newfile”存在與否,都創建鏈接。-n 如果”newfile”已存在,就不創建鏈接。

    下面舉一些例子:

    $ ls –il
    13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
    13059 -rwx - - - - - - 1 longcheng longcheng 57 8月 5 16:40 file2
    $ ln file2 file2hard
    $ ls –il
    13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
    13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
    13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard

    注 意在創建鏈接前,file1 顯示的鏈接數目為1,創建鏈接后(1)file1和file1hard的鏈接數目都變為2;(2) file1和file1hard在inode號是一樣的(3) file1和file1hard顯示的文件大小也是一樣。可見進行了ln命令的操作結果:file1和file1hard是同一個文件的兩個名字,它們具 有同樣的索引節點號和文件屬性,建立文件file1的硬鏈接,就是為file1的文件索引節點在當前目錄上建立一個新指針。如下圖,你可以刪除其中任何一 個,如rm file2 ,每次只會刪除一個指針,

    鏈接數同時減一,只有將所有指向文件內容的指針,也即鏈接數減為0時,內核才會把文件內容從磁盤上刪除。當前目錄邏輯結構:(不好意思圖沒有顯示出來)。

    還可以在不同目錄,但同一文件系統中建立文件的硬鏈接。設file1、file2在目錄/home/longcheng/dir1中,下面的命令,在/home/longcheng中建立file2的硬鏈接。

    ln file2 /home/longcheng/file2hard

    下面的程序,是將dir1目錄中所有文件,在目錄dir2中建立硬鏈接

    $mkdir dir2
    $ln /home/longcheng/dir1/* /home/longcheng/dir2

    如果使用了 ln –f existingfile newfile,如果newfile已經存在,則無論原來newfile是什么文件,只用當前用戶對它有寫權限,newfile就成為exisitngfile的硬鏈接文件。

    盡 管硬鏈接節省空間,也是Linux系統整合文件系統的傳統方式,但是存在一下不足之處:(1)不可以在不同文件系統的文件間建立鏈接(2)只有超級用戶才 可以為目錄創建硬鏈接。雖然很多樹上說root用戶可以創建,但是筆者在學習過程中發現即使是root用戶也不能創建,我的系統是Redhat,內核 2.4、2.6都試過,在其他系統中不知道是不是可以。

    二、軟鏈接(符號鏈接)

    軟鏈接克服了硬鏈接的不足,沒有任何文件系統的限制,任何用戶可以創建指向目錄的符號鏈接。因而現在更為廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器、不同網絡對文件進行鏈接。

    建立軟鏈接,只要在ln后面加上選項 –s,下面舉個例子

    $ ls -il
    13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
    13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
    13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard
    $ln –s file1 file1soft
    $ls -il
    13058 -rwx - - - - - - 1 longcheng longcheng 48 8月 5 16:38 file1
    13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2
    13059 -rwx - - - - - - 2 longcheng longcheng 57 8月 5 16:40 file2hard
    13061 lrwxrwxrwx 1 longcheng longcheng 5 8月 5 16:58 file1soft->file1

    從 上面鏈接后的結果可以看出來軟鏈接與硬鏈接,區別不僅僅是在概念上,在實現上也是不同的。區別:硬鏈接原文件&鏈接文件公用一個inode號,說明他們是 同一個文件,而軟鏈接原文件&鏈接文件擁有不同的inode號,表明他們是兩個不同的文件;在文件屬性上軟鏈接明確寫出了是鏈接文件,而硬鏈接沒有寫出 來,因為在本質上硬鏈接文件和原文件是完全平等關系;鏈接數目是不一樣的,軟鏈接的鏈接數目不會增加;文件大小是不一樣的,硬鏈接文件顯示的大小是跟原文 件是一樣的,這用強調,因為是等同的嘛,而這里軟鏈接顯示的大小與原文件就不同了,file1大小是48B,而file1soft是5B,這里面的5實際 上就是“file1”的大小。

    總之,建立軟鏈接就是建立了一個新文件。當訪問鏈接文件時,系統就會發現他是個鏈接文件,它讀取鏈接文件找到真正要訪問的文件。

    在不同系統之間建立軟鏈接、對目錄建立鏈接,這里就不舉例了,讀者可以自己去嘗試,我也是在不斷實踐中學習的。

    當 然軟鏈接也有硬鏈接沒有的缺點,因為鏈接文件包含有原文件的路徑信息,所以當原文件從一個目錄下移到其他目錄中,再訪問鏈接文件,系統就找不到了,而硬鏈 接就沒有這個缺陷,你想怎么移就怎么移;還有它要系統分配額外的空間用于建立新的索引節點和保存原文件的路徑。補充一下:可以通過symlink來查看鏈 接文件,可以用 man symlink來學習。

    posted @ 2009-11-14 19:31 BlakeSu 閱讀(173) | 評論 (0)編輯 收藏

    殺手級全局css重置方法匯總

    a-killer-collection-of-global-css-reset-styles


    殺手級全局css重置方法匯總

    由于各個瀏覽器對頁面元素的默認邊距等設置不同,在開發跨瀏覽器的大型網站時,需要對這些默認設置進行重置。

    這篇文章就是對各種重置方法的匯總。

    posted @ 2009-11-14 17:19 BlakeSu 閱讀(160) | 評論 (0)編輯 收藏

    讓你意想不到:世界網頁之最

    這個世界無奇不有,就連做網頁都要拼個高低長短,當你上網百般無聊之際,不妨看一看網絡中的世界之最吧!

    1.最寬網頁

    你可曾想過,網站就是一道空白的墻壁,然后你可以自由的在墻壁上涂鴉,發揮你的想象力。

    號稱世界最寬的網站“bluesfear”,是由眾多的藝術工作者提供一副又一副的創意作品,拉著滾動條好像在坐火車那般,沿途欣賞風景。

    bluesfear目前的寬度還在不斷增長中,它還邀請全世界各路設計師,在“墻上”作畫,讓該網站一直延伸下去,喜歡創作的你也可以設計一張能夠跟最后一張連續的圖片提交上去。

    ●網址:http://worm.bluesfear.com/index2.html

    2.最高網頁

    有了最寬網頁,就來看看最高的網頁吧!這個目前高1萬8千939公里的網頁“worlds-highest-website”,瀏覽者可以手動滾動網頁,或使用電梯。如果你向使用滑鼠滾輪看網頁最下面的圖片,應該是不可能,除非你非常有耐力。

    ●網址:http://worlds-highest-website.com/

    az

    3.最貴網頁

    英國nottingham大學生亞力,因籌集自己的大學學費而又不想跟銀行借貸款,突發奇想的用了10分鐘就建立了一個名叫百萬首頁的網站,然后將這個網站的首頁平均分成1萬份,每一份只是一個小小的格子。

    他宣稱每個格子賣100美元,買家可以在自己購買的格子中隨意放任何東西,包括商標、名字、或者特意設計的圖片鏈接等等。于是一個幾乎是零成本的網頁在經過Alex的創意后,總價值就變成了一個高達百萬美元的網頁。 中國站.長.站

    ●網址:http://www.milliondollarhomepage.com

    4.最小網頁

    由阿蘭·奧登設計的世界最小的網站“guimp”,它的首頁的大小只相當于一個圖標,此外什么也沒有。雖然設計小,但五臟俱全,里面還有游戲、博客、相冊等,不過這網站非常考你的視力,也許想看也看不到。

    ●網址:http://www.guimp.com

    posted @ 2009-11-14 17:14 BlakeSu 閱讀(175) | 評論 (0)編輯 收藏

    MySQL用戶管理

    MySQL管理員應該知道如何設置MySQL用戶賬號,指出哪個用戶可以連接服務器,從哪里連接,連接后能做什么。MySQL 3.22.11開始引入兩條語句使得這項工作更容易做:GRANT語句創建MySQL用戶并指定其權限,而REVOKE語句刪除權限。兩條語句扮演了 mysql數據庫的前端角色,并提供與直接操作這些表的內容不同的另一種方法。CREATE和REVOKE語句影響4個表:授權表

    內容

    user 能連接服務器的用戶以及他們擁有的任何全局權限
    db 數據庫級權限
    tables_priv 表級權限
    columns_priv 列級權限


    還有第5個授權表(host),但它不受GRANT和REVOKE的影響。

    當你對一個用戶發出一條GRANT語句時,在user表中為該用戶創建一條記錄。如果語句指定任何全局權限(管理權限或適用于所有數據庫的權限),這些 也記錄在user表中。如果你指定數據庫、表和列級權限,他們被分別記錄在db、tables_priv和columns_priv表中。

    用GRANT和REVOKE比直接修改授權表更容易些,然而,建議你閱讀一下《MySQL安全性指南》。這些表異常重要,而且作為一名管理員,你應該理解它們如何超越GRANT和REVOKE語句的功能水平。

    在下面的章節中,我們將介紹如何設置MySQL用戶賬號并授權。我們也涉及如何撤權和從授權表中刪除用戶。

    你可能也想考慮使用mysqlaccess和mysql_setpermission腳本,它是MySQL分發的一部分,它們是Perl腳本,提供GRANT語句的另一種選擇設置用戶賬號。mysql_setpermission需要安裝DBI支持。

    1 創建用戶并授權

      GRANT語句的語法看上去像這樣:GRANT privileges (columns) ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION 
    要使用該語句,你需要填寫下列部分:

    privileges

    授予用戶的權限,下表列出可用于GRANT語句的權限指定符:

    權限指定符 權限允許的操作
    ALTER 修改表和索引
    CREATE 創建數據庫和表
    DELETE 刪除表中已有的記錄
    DROP 拋棄(刪除)數據庫和表
    INDEX 創建或拋棄索引
    INSERT 向表中插入新行
    REFERENCE 未用
    SELECT 檢索表中的記錄
    UPDATE 修改現存表記錄
    FILE 讀或寫服務器上的文件
    PROCESS 查看服務器中執行的線程信息或殺死線程
    RELOAD 重載授權表或清空日志、主機緩存或表緩存。
    SHUTDOWN 關閉服務器
    ALL 所有;ALL PRIVILEGES同義詞
    USAGE 特殊的“無權限”權限


      上表顯示在第一組的權限指定符適用于數據庫、表和列,第二組數管理權限。一般,這些被相對嚴格地授權,因為它們允許用戶影響服務器的操作。第三組權限特殊,ALL意味著“所有權限”,UASGE意味著無權限,即創建用戶,但不授予權限。

    columns

      權限運用的列,它是可選的,并且你只能設置列特定的權限。如果命令有多于一個列,應該用逗號分開它們。

    what

    權限運用的級別。權限可以是全局的(適用于所有數據庫和所有表)、特定數據庫(適用于一個數據庫中的所有表)或特定表的。可以通過指定一個columns字句是權限是列特定的。

    user

    權限授予的用戶,它由一個用戶名和主機名組成。在MySQL中,你不僅指定誰能連接,還有從哪里連接。這允許你讓兩個同名用戶從不同地方連接。MySQL讓你區分他們,并彼此獨立地賦予權限。

    MySQL中的一個用戶名就是你連接服務器時指定的用戶名,該名字不必與你的Unix登錄名或Windows名聯系起來。缺省地,如果你不明確指定一個 名字,客戶程序將使用你的登錄名作為MySQL用戶名。這只是一個約定。你可以在授權表中將該名字改為nobody,然后以nobody連接執行需要超級 用戶權限的操作。

    password

    賦予用戶的口令,它是可選的。如果你對新用戶沒有指定 IDENTIFIED BY子句,該用戶不賦給口令(不安全)。對現有用戶,任何你指定的口令將代替老口令。如果你不指定口令,老口令保持不變,當你用IDENTIFIED BY時,口令字符串用改用口令的字面含義,GRANT將為你編碼口令,不要象你用SET PASSWORD 那樣使用password()函數。

    WITH GRANT OPTION子句是可選的。如果你包含它,用戶可以授予權限通過GRANT語句授權給其它用戶。你可以用該子句給與其它用戶授權的能力。

    用戶名、口令、數據庫和表名在授權表記錄中是大小寫敏感的,主機名和列名不是。
    一般地,你可以通過詢問幾個簡單的問題來識別GRANT語句的種類:

    誰能連接,從那兒連接?
    用戶應該有什么級別的權限,他們適用于什么?
    用戶應該允許管理權限嗎?
    下面就討論一些例子。

    1.1 誰能連接,從那兒連接?


    你可以允許一個用戶從特定的或一系列主機連接。有一個極端,如果你知道降職從一個主機連接,你可以將權限局限于單個主機

    :GRANT ALL ON samp_db.* TO boris@localhost IDENTIFIED BY "ruby"GRANT ALL ON samp_db.* TO fred@res.mars.com IDENTIFIED BY "quartz"

    (samp_db.*意思是“samp_db數據庫的所有表)

    另一個極端是,你可能有一個經常旅行并需要能從世界各地的主機連接的用戶max。在這種情況下,你可以允許他無論從哪里連接:

    GRANT ALL ON samp_db.* TO max@% IDENTIFIED BY "diamond"

    “%”字符起通配符作用,與LIKE模式匹配的含義相同。在上述語句中,它意味著“任何主機”。所以max和max@%等價。這是建立用戶最簡單的方法,但也是最不安全的。

    取其中,你可以允許一個用戶從一個受限的主機集合訪問。例如,要允許mary從snake.net域的任何主機連接,用一個%.snake.net主機指定符:

    GRANT ALL ON samp_db.* TO mary@.snake.net IDENTIFIED BY "quartz";

    如果你喜歡,用戶標識符的主機部分可以用IP地址而不是一個主機名來給定。你可以指定一個IP地址或一個包含模式字符的地址,而且,從MySQL 3.23,你還可以指定具有指出用于網絡號的位數的網絡掩碼的IP號:

    GRANT ALL ON samp_db.* TO boris@192.168.128.3 IDENTIFIED BY "ruby" GRANT ALL ON samp_db.* TO fred@192.168.128.% IDENTIFIED BY "quartz" GRANT ALL ON samp_db.* TO rex@192.168.128.0/17 IDENTIFIED BY "ruby"

    第一個例子指出用戶能從其連接的特定主機,第二個指定對于C類子網192.168.128的IP模式,而第三條語句中,192.168.128.0/17指定一個17位網絡號并匹配具有192.168.128頭17位的IP地址。 

    如果MySQL抱怨你指定的用戶值,你可能需要使用引號(只將用戶名和主機名部分分開加引號)。

    GRANT ALL ON samp_db.president TO "my friend"@"boa.snake.net"

    1.2 用戶應該有什么級別的權限和它們應該適用于什么?

    你可以授權不同級別的權限,全局權限是最強大的,因為它們適用于任何數據庫。要使ethel成為可做任何事情的超級用戶,包括能授權給其它用戶,發出下列語句:

    GRANT ALL ON *.* TO ethel@localhost IDENTIFIED BY "coffee" WITH GRANT OPTION

    ON子句中的*.*意味著“所有數據庫、所有表”。從安全考慮,我們指定ethel只能從本地連接。限制一個超級用戶可以連接的主機通常是明智的,因為它限制了試圖破解口令的主機。

    有 些權限(FILE、PROCESS、RELOAD和SHUTDOWN)是管理權限并且只能用"ON *.*"全局權限指定符授權。如果你愿意,你可以授權這些權限,而不授權數據庫權限。例如,下列語句設置一個flush用戶,他只能發出flush語句。 這可能在你需要執行諸如清空日志等的管理腳本中會有用:

    GRANT RELOAD ON *.* TO flushl@localhost IDENTIFIED BY "flushpass"

    一般地,你想授權管理權限,吝嗇點,因為擁有它們的用戶可以影響你的服務器的操作。
    數據庫級權限適用于一個特定數據庫中的所有表,它們可通過使用ON db_name.*子句授予:

    GRANT ALL ON samp_db TO bill@racer.snake.net INDETIFIED BY "rock" GRANT SELECT ON samp_db TO ro_user@% INDETIFIED BY "rock"

    第一條語句向bill授權samp_db數據庫中所有表的權限,第二條創建一個嚴格限制訪問的用戶ro_user(只讀用戶),只能訪問samp_db數據庫中的所有表,但只有讀取,即用戶只能發出SELECT語句。

    你可以列出一系列同時授予的各個權限。例如,如果你想讓用戶能讀取并能修改現有數據庫的內容,但不能創建新表或刪除表,如下授予這些權限:

    GRANT SELECT,INSERT,DELETE,UPDATE ON samp_db TO bill@snake.net INDETIFIED BY "rock"

    對于更精致的訪問控制,你可以在各個表上授權,或甚至在表的每個列上。當你想向用戶隱藏一個表的部分時,或你想讓一個用戶只能修改特定的列時,列特定權限非常有用。如:

    GRANT SELECT ON samp_db.member TO bill@localhost INDETIFIED BY "rock"GRANT UPDATE (expiration) ON samp_db. member TO bill@localhost

    第一條語句授予對整個member表的讀權限并設置了一個口令,第二條語句增加了UPDATE權限,當只對expiration列。沒必要再指定口令,因為第一條語句已經指定了。

    如果你想對多個列授予權限,指定一個用逗號分開的列表。例如,對assistant用戶增加member表的地址字段的UPDATE權限,使用如下語句,新權限將加到用戶已有的權限中:

    GRANT UPDATE (street,city,state,zip) ON samp_db TO assistant@localhost

    通 常,你不想授予任何比用戶確實需要的權限寬的權限。然而,當你想讓用戶能創建一個臨時表以保存中間結果,但你又不想讓他們在一個包含他們不應修改內容的數 據庫中這樣做時,發生了要授予在一個數據庫上的相對寬松的權限。你可以通過建立一個分開的數據庫(如tmp)并授予開數據庫上的所有權限來進行。例如,如 果你想讓來自mars.net域中主機的任何用戶使用tmp數據庫,你可以發出這樣的GRANT語句:

    GRANT ALL ON tmp.* TO ""@mars.net

    在你做完之后,用戶可以創建并用tmp.tbl_name形式引用tmp中的表(在用戶指定符中的""創建一個匿名用戶,任何用戶均匹配空白用戶名)。

    1.3 用戶應該被允許管理權限嗎?

    你 可以允許一個數據庫的擁有者通過授予數據庫上的所有擁有者權限來控制數據庫的訪問,在授權時,指定WITH GRANT OPTION。例如:如果你想讓alicia能從big.corp.com域的任何主機連接并具有sales數據庫中所有表的管理員權限,你可以用如下 GRANT語句:

    GRANT ALL ON sales.* TO alicia@%.big.corp.com INDETIFIED BY "applejuice" WITH GRANT OPTION

    在 效果上WITH GRANT OPTION子句允許你把訪問授權的權利授予另一個用戶。要注意,擁有GRANT權限的兩個用戶可以彼此授權。如果你只給予了第一個用戶SELECT權 限,而另一個用戶有GRANT加上SELECT權限,那么第二個用戶可以是第一個用戶更“強大”。

    2 撤權并刪除用戶

    要取消一個用戶的權限,使用REVOKE語句。REVOKE的語法非常類似于GRANT語句,除了TO用FROM取代并且沒有INDETIFED BY和WITH GRANT OPTION子句:

    REVOKE privileges (columns) ON what FROM user

    user部分必須匹配原來GRANT語句的你想撤權的用戶的user部分。privileges部分不需匹配,你可以用GRANT語句授權,然后用REVOKE語句只撤銷部分權限。

    REVOKE語句只刪除權限,而不刪除用戶。即使你撤銷了所有權限,在user表中的用戶記錄依然保留,這意味著用戶仍然可以連接服務器。要完全刪除一個用戶,你必須用一條DELETE語句明確從user表中刪除用戶記錄:

    %mysql -u root mysqlmysql>DELETE FROM user ->WHERE User="user_name" and Host="host_name";mysql>FLUSH PRIVILEGES; 

    DELETE語句刪除用戶記錄,而FLUSH語句告訴服務器重載授權表。(當你使用GRANT和REVOKE語句時,表自動重載,而你直接修改授權表時不是。)

    posted @ 2009-11-14 17:11 BlakeSu 閱讀(159) | 評論 (0)編輯 收藏

    JavaScript的Number對象

    Number對象的屬性
    屬性 說明
    MAX_VALUE 最大有效數字
    MIN_VALUE 最小有效數字
    NaN 非數字
    POSITIVE_INFINITY 正無窮大
    NEGATIVE_INFINITY 負無窮大
    Number對象的方法
    方法 說明
    toExponential() 轉化為科學計數法,參數為小數點后保留的位數
    toFixed() 設定保留的小數位數,參數為小數閏數,為空則無小數部分,采用四舍五入方法進行
    toLocaleString() 轉化為本地表示方法,涉及到小數點,千分號的表示
    toString() 轉化為字符串,參數為轉化時參照的進制,默認為十進制
    toPrecision() 設定數字的精確度,參數為精度要求
    valueOf() 返回數字的數值(由Number轉化為簡單數值類型)

    posted @ 2009-11-14 14:13 BlakeSu 閱讀(162) | 評論 (0)編輯 收藏

    scrollLeft,scrollWidth,clientWidth,offsetWidth完全詳解

    scrollHeight: 獲取對象的滾動高度。
    scrollLeft:設置或獲取位于對象左邊界和窗口中目前可見內容的最左端之間的距離
    scrollTop:設置或獲取位于對象最頂端和窗口中可見內容的最頂端之間的距離
    scrollWidth:獲取對象的滾動寬度
    offsetHeight:獲取對象相對于版面或由父坐標 offsetParent 屬性指定的父坐標的高度
    offsetLeft:獲取對象相對于版面或由 offsetParent 屬性指定的父坐標的計算左側位置
    offsetTop:獲取對象相對于版面或由 offsetTop 屬性指定的父坐標的計算頂端位置
    event.clientX 相對文檔的水平座標
    event.clientY 相對文檔的垂直座標

    event.offsetX 相對容器的水平坐標
    event.offsetY 相對容器的垂直坐標
    document.documentElement.scrollTop 垂直方向滾動的值
    event.clientX+document.documentElement.scrollTop 相對文檔的水平座標+垂直方向滾動的量

    以上主要指IE之中,FireFox差異如下:
    IE6.0、FF1.06+:
    clientWidth = width + padding
    clientHeight = height + padding
    offsetWidth = width + padding + border
    offsetHeight = height + padding + border
    IE5.0/5.5:
    clientWidth = width - border
    clientHeight = height - border
    offsetWidth = width
    offsetHeight = height
    (需要提一下:CSS中的margin屬性,與clientWidth、offsetWidth、clientHeight、offsetHeight均無關)

    測試代碼:

     

     

     

    測試代碼:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "[url=http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd]http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd[/url]">
    <html xmlns="[url=http://www.w3.org/1999/xhtml]http://www.w3.org/1999/xhtml[/url]" lang="gb2312">
    <head>
    <head>
    <title> 代碼實例:關于clientWidth、offsetWidth、clientHeight、offsetHeight的測試比較 </title>
    <meta http-equiv="content-type" content="text/html; charset=gb2312" />
    <meta name="author" content="楓巖,CnLei.y.l@gmail.com">
    <meta name="copyright" content="[url=http://www.cnlei.com]http://www.cnlei.com[/url]" />
    <meta name="description" content="關于clientWidth、offsetWidth、clientHeight、offsetHeight的測試比較" />
    <style type="text/css" media="all">
    body {font-size:14px;}
    a,a:visited {color:#00f;}
    #Div_CnLei {
    width:300px;
    height:200px;
    padding:10px;
    border:10px solid #ccc;
    background:#eee;
    font-size:12px;
    }
    #Div_CnLei p {margin:0;padding:10px;background:#fff;}
    </style>
    <script type="text/javascript">
    function Obj(s){
    return document.getElementById(s)?document.getElementById(s):s;
    }
    function GetClientWidth(o){
    return Obj(o).clientWidth;
    }
    function GetClientHeight(o){
    return Obj(o).clientHeight;
    }
    function GetOffsetWidth(o){
    return Obj(o).offsetWidth;
    }
    function GetOffsetHeight(o){
    return Obj(o).offsetHeight;
    }
    </script>
    </head>
    <body>
    <p>點擊下面的鏈接:</p>
    <div id="Div_CnLei">
    <p><a href="javascript:alert(GetClientWidth('Div_CnLei'));">GetClientWidth();</a>  <a href="javascript:alert(GetClientHeight('Div_CnLei'));">GetClientHeight();</a></p>
    <p><a href="javascript:alert(GetOffsetWidth('Div_CnLei'));">GetOffsetWidth();</a>  <a href="javascript:alert(GetOffsetHeight('Div_CnLei'));">GetOffsetHeight();</a></p>
    </div>
    <div id="Description">
    <p><strong>IE6.0、FF1.06+:</strong><br />
    clientWidth = width + padding = 300+10×2 = 320<br />
    clientHeight = height + padding = 200+10×2 = 220<br />
    offsetWidth = width + padding + border = 300+10×2+10×2= 340<br />
    offsetHeight = height + padding + border = 200+10×2+10×2 = 240</p>
    <p><strong>IE5.0/5.5:</strong><br />
    clientWidth = width - border = 300-10×2 = 280<br />
    clientHeight = height - border = 200-10×2 = 180<br />
    offsetWidth = width = 300<br />
    offsetHeight = height = 200</p>
    </div>
    </body>
    </html>

    posted @ 2009-11-14 14:12 BlakeSu 閱讀(158) | 評論 (0)編輯 收藏

    firefox event.srcElement

    event.srcElement從字面上可以看出來有以下關鍵字:事件,源 他的意思就是:當前事件的源,

    我們可以調用他的各種屬性 就像:document.getElementById(”")這樣的功能,

    經常有人問 firefox 下的 event.srcElement 怎么用,在此詳細說明:

    IE下,event對象有srcElement屬性,但是沒有target屬性;Firefox下,event對象有target屬性,但是沒有srcElement屬性.但他們的作用是相當的,即:

    firefox 下的 event.target = IE 下的 event.srcElement

    解決方法:使用obj(obj = event.srcElement ? event.srcElement : event.target;)來代替IE下的event.srcElement或者Firefox下的event.target.

    posted @ 2009-11-14 14:11 BlakeSu 閱讀(541) | 評論 (0)編輯 收藏

    僅列出標題
    共12頁: First 上一頁 3 4 5 6 7 8 9 10 11 下一頁 Last 
    主站蜘蛛池模板: 午夜视频免费在线观看| 亚洲人成人伊人成综合网无码| 国产精品久久久久久亚洲小说| 免费H网站在线观看的| 亚洲综合网美国十次| 在线成人爽a毛片免费软件| 91亚洲国产成人久久精品网站| 免费91麻豆精品国产自产在线观看 | 在线看片免费不卡人成视频| 亚洲另类小说图片| 成人影片麻豆国产影片免费观看| 亚洲在成人网在线看| 日韩毛片免费无码无毒视频观看| 亚洲中文字幕AV在天堂| 麻豆国产VA免费精品高清在线 | 亚洲三级高清免费| 亚洲久悠悠色悠在线播放| 青青草国产免费久久久下载| 日韩精品亚洲专区在线影视| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 免费国产成人高清视频网站 | 国产成人综合亚洲绿色| 亚洲中文字幕成人在线| 午夜网站在线观看免费完整高清观看| 久久亚洲精品无码AV红樱桃| 97免费人妻无码视频| 国产精品无码亚洲一区二区三区 | 亚洲最大的成网4438| 在线精品一卡乱码免费| 亚洲.国产.欧美一区二区三区| 亚洲麻豆精品国偷自产在线91| 久久国产精品免费看| 亚洲人成综合在线播放| 免费大片黄手机在线观看| 男人的天堂网免费网站| 亚洲综合av一区二区三区不卡 | 亚洲精品视频在线| 成年性生交大片免费看| 精精国产www视频在线观看免费| 亚洲伊人精品综合在合线| 亚洲?v无码国产在丝袜线观看|