※準備多色筆 講師: 李爵樺 (小州) Linux system / networking administration Unix system / networking programming Linux I18N / L10N (國際化/本土化) 課程內容: 課程時數: 78hr (26堂課) 課程時間: 週二、四晚上 6:30 ~ 9:30 (約10:00pm下課) 1) Linux System Administration (LSA) 2) Linux Network Administration (LNA) 3) Linux Enterprise Administration (LEA) 課程系統: Fedora Linux Core 1 認證考試: 1) RHCE (Red Hat Certified Engineer), RHCT (new) 考試費用: NT$15,000 考試內容: http://edu.uuu.com.tw/certify/rhce.htm 2) LPIC (Linux Professional Institute Cortication) 考試費用: US$100 x 2 考試內容: (純筆試) Level I: 101, 102 Level II: 201, 202 模擬試題: http://www.linux-praxis.de/lpisim/lpi.html Linux 簡介: Unix-Like 作業系統: 1) Sun Solaris (商用) 2) IBM AIX (商用) 3) HP Unix (商用) 4) BSD 流派: FreeBSD、NetBSD 5) Linux 系統: RedHat、Debian Linux OS 設計運作: 1) 單人單工 2) 多人多工 硬體平台架構: 1) x86 (i386, i586...) 2) power pc (apple) 3) sparc 4) alpha 軟體程式碼: 1) Open Source 2) Close Source OS組成: 1) kernel (核心) 2) system tools (系統工具) 3) applications (應用軟體) 人物名詞: 1) Hacker (good) 2) Cracker (bad) 名詞項目: 1) FSF (Free Software Foundation, 自由軟體基金會, http://www.fsf.org/) 2) GNU (GNU's Not Unix, 由自由軟體基金會主持的軟體計劃, http://www.gnu.org/) 3) Free Software (自由軟體) 綜合以上發展成為: GNU/Linux ==> 以 Torvalds 所開發的 kernel + GNU 發展的軟體 中文環境需求項目: 1) 中文字型 2) 中文輸入法程式 3) 中文輸入法表格 4) 軟體化必要中文化修改 Distribution + CLE: 1) RedHat + CLE 2) Mandrake + CLE 3) Slackware + CLE Linux 取得方式: 1) 買 Linux 書籍 + CD Disc 2) 買官方版本 3) 買零售 CD Disc 4) 網路 Download Linux 網路服務: 1) Web Service Web 語言: PHP 相關Web軟體: phpBB (www.phpbb.com)、Gallery (gallery.sf.net) 2) Mail Service Web Mail 軟體: Openwebmail (www.openwebmail.org) 3) Domain Name Service 4) Database Server 資料庫系統: MySQL (www.mysql.com)、PostgreSQL (www.postgresql.com) Linux 安裝基礎: Linux 硬體裝置存取: Linux 對於系統所有週邊裝置皆視為檔案看待, 即系統有許多檔案本身應對到實際的週邊裝置。 當開啟該檔案進行讀取寫入,便相當於針對該週邊裝置進行溝通。 該特殊的檔案稱為裝置檔案 (Device File)。 Linux 裝置檔案類表: 1) IDE Device IDE0: primary master: hda ; primary slave: hdb IDE1: secondary master: hdc ; secondary slave: hdd hde, hdf... (非主機板標準 IDE 埠) 2) SCSI HD Device (依掃描順序) → 隨身碟亦以此為名 第一台 HD: sda 第二台 HD: sdb 3) SCSI CDROM Device (屬性: b 區塊裝置) 第一台 CDROM: scd0 第二台 CDROM: scd1 4) Floppy Device (屬性: b 區塊裝置) 第一台 Floppy: fd0 第二台 Floppy: fd1 5) Serial Device (COM Port) (屬性: c 字元裝置) COM1: ttyS0 COM2: ttyS1 6) Parallel Device (並列埠) (屬性: c 字元裝置) LPT1: lp0 LPT2: lp1 7) PS/2 mouse: psaux 實體硬碟結構: 1) Cylinder (磁柱): 0 起跳 (若標註 C=1000, 則表示 0 ~ 1000) 2) Head (磁頭): 0 起跳 3) Sector (磁區): 1 起跳 註: 1) 總空間 = C x H x S x 512 其中 512 為每 Sector 為 512 Bytes 2) Cylinder 早期稱為 Track, 為磁軌 分割區 (Partition): HD 實際欲進行 OS 安裝, 必須將 HD 空間劃分為許多個別獨立空間才可使用, 此個別空間即為分割區 (partition)。 分割區類型: 1) primary partition 2) extended partition 3) logical partition 分割區特點: 1) primary partition ID: 1 ~ 4 數量: 0 ~ 4, 最多四個 2) extended partition ID: 1 ~ 4 數量: 0 ~ 1, 最多一個 3) logical partition ID: 5 起跳 數量: IDE 裝置, ID 為 5 ~ 63 ex. 切五個 partition: hda1 hda2 (primary), hda3 (extended) -> hda5 hda6 hda7 (logical) ps. Linux 不一定要裝在 primary 上面, 只要有空間就可以裝 (不同於 Windows 系統) 分割工具: 1) fdisk (dos, win9x) 2) spfdisk (不支援 2k, xp) 3) partition magic Linux 安裝基礎: •partition system ID 說明:當分割區建立完成後, 分割區本身會標註一代碼表示不同 OS 系統所使用的分割區項目。 •partition system ID 列表 (因空間的定址不同, 分成許多不同的 partition system id) 1) FAT12: 1 2) FAT16 < 32M: 4 (最大 32MB) 3) FAT16: 6 (最大 2GB) 4) FAT32: b 5) FAT32 (LBA): c 6) FAT16 (LBA): e 7) Extended: 5 8) Extended (LBA): f 9) Minix: 81 10) Linux Swap: 82 11) Linux Native: 83 12) Linux LVM: 8e 13) Linux RAID: fd 14) NTFS/HPFS: 7 •Linux 分割區 1) Linux Swap: 提供以硬碟空間模擬系統可用記憶體, 稱為“虛擬記憶體分割區” 一般空間: RAM x 2 ~ 3 (但 RAM 越多, SWAP 使用機率越低, 所以建議不超過 512MB) ps. x86 平台 SWAP 無法超過 2GB 2) Linux Native: 系統實際放置儲存資料的分割區 •相關名詞 1) FAT: File Allocation Table (檔案配置表, 所有的 Windows 系統都可以裝在 FAT 上) 2) LBA: Logical Block Address (邏輯區塊位址) 3) LVM: Logical Volume Manager •存取硬碟定址 1) CHS --> C x H x S (因 c <= 1023, 所以早期 CHS 硬碟最大至 500MB 左右) 2) LBA --> C 折半, 把數值分配到 H 跟 S (8.4 GB 左右是瓶頸) •定址環境 1) IDE: cylinder 最多 65535 2) BIOS: cylinder 最多 1023 (所以早期製作硬碟時, IDE HDD cylinder 都不超過 1023) Linux 安裝硬體需求: 1) CPU (越快越好) SMP (多重處理器架構) 2) HD - 建議: Linux Native 至少 4GB 3) RAM - 文字模式: 64MB ~ 128MB; 圖形模式: 至少 256MB; 最多可支援到 64GB 4) Sound Card 軟體專案: 1> OSS (Open Sound System) 2> ALSA ==> http://www.alsa-project.org/ (Fedora Core 1 未納入; Fedora Core 2 才納入) 5) Display Card X Window System (http://www.x.org/) --> 架構 XFree86 Project (http://www.xfree86.org/) --> 發展使用 X 協定的軟體、驅動程式 Desktop Manager Environment 1> KDE (http://www.kde.org/) 2> GNOME (http://www.gnome.org/) 6) Network Card RTL8139 3COM 硬體支援清單列表: 1) RedHat: http://hardware.redhat.com/ 2) Mandrake: http://www.mandrake.com/ (點選 supported hardware) Linux 系統安裝: Linux 系統安裝來源項目: 1) CDROM 2) Hard Disk 3) Networking 1> NFS 2> FTP Linux 開機安裝項目: 1) linux (預設安裝模式) 2) linux text (文字模式安裝) 3) expert (專家模式, 提供網路等特殊安裝) Linux分割區: 1) Linux Swap 2) Linux Native Linux 檔案系統支援: 1) Linux ext2 fs (second extended fs) 2) Linux ext3 fs (ext2 + journaling) 3) SuSE reiser fs (kernel 2.4) 4) IBM JFS (kernel 2.6) 5) SGI XFS (kernel 2.6) 註: 1) 其中 2 ~ 5 為日誌式檔案系統 (NTFS 亦是日誌式檔案系統) 2) 日誌式檔案系統 (journaling filesystem) 提供資料可靠保護的環境。 Linux 樹狀目錄結構: / <-- mount (掛載) hda1 (30GB) usr bin lib home peter allen doc bin mnt cdrom tmp <-- mount hdb2 (20GB) Linux 系統安裝: 開機管理程式: 程式項目: (----- 裝在 first sector of partition 裡的東西) 1) LILO (也可以裝在 MBR 中, 這樣就可以啟動裝在 Extended 磁區裡的 Linux) 2) GRUB 程式功能: 1) Linux 核心載入程式 2) 多重作業系統開機管理程式 開機運作: ====== --> MBR (Master Boot Record, 可以裝 spfdisk、lilo、grub... 等開機管理程式) ------ --> first sector of partition ------ --> 同 f ------ --> 同 f 註: 1) MBR 包含“開機程式”與“分割表”(total 512 bytes) 2) MBR 位於 C=0, H=0, S=1 的磁區位置 3) MBR 上開機程式依“開機旗標”決定所要啟動的 OS Linux 網路設定: 網路介面名稱: 1) ethernet: eth0, eth1... 2) point to point: ppp0, ppp1... 網路連線方式: 1) Static IP (靜態 IP) 2) DHCP (由 DHCP 主機分配) 3) Dialup (撥接) - Fedora 安裝時無法選用此選項 Linux 使用者帳號: 1) 管理者 2) 保留使用者 3) 一般使用者 Linux 入門: (教室開機選項密碼:col) 系統登入模式: 1) console 文字介面 2) GUI X 圖形介面 3) remote 遠端模式 系統登出方式: 1) 於文字模式 1> logout 或 exit 2> 按 Ctrl + D 2) 於 X 環境 1> 正常登出 2> Ctrl + Alt + BS 強迫跳出 主機預設建立帳號: 1) root, pwd=lccnet 2) lccnet, pwd=123456 主機虛擬控制台按鍵: Ctrl + Alt + F1 ~ F12 註: 1) 稱呼為 tty1 ~ tty12 2) Console 模式可省略 Ctrl 3) 文字模式提供 6 組 (tty1 ~ tty6) 新增使用者帳號: 1) adduser ID 2) passwd ID 刪除使用者帳號: userdel -r ID 註: -r 表示一併刪除家目錄等項目 切換使用者帳號: su -l ID (switch user) 註: 1) -l 可用 - 參數取代 2) -l 表示一併帶入目的使用者環境 3) ID 省略時, 表示切換至 root 身份 指令: cal 月曆 locale 查看目前語系 whoami; id 檢視使用者身份 free 檢視主記憶體使用率 df 檢視分割區磁碟使用率 (disk free) top 檢視主記憶體行程執行資訊 dmesg 檢視核心暫存 buffer 內的訊息 w; who 檢視目前主機線上使用者 繁體中文: zh_TW.UTF-8 (unicode) -> 目前不穩定, 應改為 zh_TW Linux 樹狀目錄遊走檢視: 程式項目: 1) ls (list) 說明: 顯示檔案目錄資訊 2) pwd (print working directory) 說明: 顯示目前工作目錄 3) cd (change directory) 說明: 切換至指定目錄 路徑與目錄: 說明: 用來表示樹狀目錄結構內的所在位置稱為路徑 (path) 路徑分類: 1) 絕對路徑 -> 以 / 目錄開始連續階層表示目的所在位置 2) 相對路徑 -> 以某特定位置為基準點表示目的所在位置 特殊目錄: 1) . -> 表示目前所在目錄 2) .. -> 表示上一層目錄 ~ 符號: 1) ~: 表示目前使用者家目錄 2) ~ID: 表示 ID 使用者家目錄 cd 程式使用: 使用 cd 指令來指定目的切換目錄, cd 不加參數表示切換至自己家目錄 home directory: 家目錄, 提供使用者放置自己相關檔案目錄位置 範例: 1.決定下列的路徑類型: 1) /home/alex ==> 絕對 2) ../tmp ==> 相對 3) doc/file.txt ==> 相對 4) /usr/bin/kedit ==> 絕對 5) /tmp/../bin/gzip ==> 絕對 6) file.txt ==> 相對 2.決定下列表示法完整路徑 1) ~/tmp (以 peter 身份存取) ==> /home/peter/tmp 2) ~/doc/../../peter (以 cox 身份存取) ==> /home/peter 3) ~peter/report (以 root 身份存取) ==> /home/peter/report 4) ~allen/peter/tmp (以 root 身份存取) ==> /home/allen/peter/tmp pushd / popd 指令使用: 1) pushd . ==> 儲存目前工作目錄(可記錄多次,以堆疊方式記錄) 2) popd ==> 恢復最近儲存目錄(回到儲存目錄,並清除儲存記錄) 目錄,檔案名稱自動補齊: 使用 tab 按鍵達成 * Linux 系統重新開機與關機: 1) 重新開機: shutdown -r now 或 reoot 或 init 6 2) 關機: shutdown -h now 或 halt (halt -p) 或 init 0 或 poweroff *檔案目錄管理 長格式 (long format): 說明: 執行 ls 程式搭配 -l 參數可使用長格式顯示輸出表現檔案目錄更詳細資訊 長格式內容: drwxr-xr-x 2 root root 4096 Apr 5 18:00 bin 12-------- 3 4-------- 5--- 6---------- 7-- 格式內容說明: 1) 屬性 (attribute) 2) 權限 (permission) 3) 檔案: 硬連結數量 目錄: 子目錄數量 (目錄須扣掉 . 和 .. 兩個) 4) 擁有者 (owner) 與群組 (group) 5) 檔案: 長度,大小 目錄: 配置佔用空間 6) 建立/修改時間 權限: rwxr-xr-x 1--2--3-- 1 = owner 2 = group 3 = other 權限數字表示: r:4, w:2, x:1 範例: 1) rwxr-xr-x ==> 755 2) r--r-x-w- ==> 452 3) ---r----- ==> 040 屬性字元與意義: 1) d: directory (目錄) --> 深藍色 2) -: regular (一般檔案) --> 白色, 綠色(可執行檔), 紫色 (圖形檔) 3) l: symbolic link file (符號連結檔) --> 淡藍色 (ex. /bin/view) 4) b: block device file (區塊裝置) --> 黃色/棕色 (ex. /dev/hda) 儲存媒介裝置 5) c: character device file (字元裝置) --> 黃色/棕色 (ex. /dev/psaux) 顯示,I/O 6) p: pipe line file / FIFO (管線檔案) --> 黃色/棕色 (ex. /dev/initctl) 7) s: socket file --> 紫色 (ex. /dev/log) ps. http://dev.csdn.net/article/9/9916.shtm 有 socket file 的說明. 執行檔: regular file 權限具備 x 字元, 便稱為可執行檔. (綠色) 執行檔放置路徑: 1) /bin, /usr/bin (一般使用者用的執行檔) 2) /sbin, /usr/sbin (管理者用的執行檔) 3) /usr/X11R6/bin (跟 X window 相關的執行檔) 4) /usr/local/bin, /usr/local/sbin (手動安裝其他軟體的執行檔) *檔案目錄管理: 程式參數說明/文件: 1) program --help 2) man program ls 程式範例: 1) ls /bin/gzip /bin/cp (列示 /bin/gzip 與 /bin/cp 這兩個檔案) 2) ls /bin (顯示 /bin 目錄裡面的檔案) 3) ls -l /bin (以-l 使用較長格式列出資訊) 4) ls -ld /bin (-d 只顯示/bin這個目錄的資訊,不顯示目錄裡面的資料) 5) ls -R /etc (-R 同時列出所有副目錄層) 6) ls -lh /bin (-h print sizes in human readable format) 7) ls -lSh /bin (-S 根據檔案大小排序->由大到小顯示) 8) ls -lShr /bin (-r 依相反次序排列) 9) ls --color=none /bin (--color=none 不使用色彩區別檔案) A) ls --color=none -F /bin (-F 加上檔案類型的指示符號) B) ls --full-time -l / (--full-time 顯示完整時間資訊) C) ls -a /bin (-a 不隱藏任何以 . 字元開始的項目) D) ls -a ~ ps. -F 參數顯示: 1) *: 可執行檔 2) /: 目錄 3) @: 符號連結檔 4) |: 管線檔案 5) =: socket file 隱藏檔: 名稱以 . 開頭的檔案, 目錄 (通常為設定檔或設定檔的目錄) *檔案目錄管理: 預設環境: 於自己家目錄中建立 tmp, 並進入 tmp 目錄進行下列操作 範例: 1) mkdir test1 test2 test3 2) mkdir "This is test directory" 3) mkdir -p data1/data2/data3 (加上 -p 可建立連續多層目錄) 4) rmdir test1 test2 test3 5) rmdir "This is test directory" 6) touch data1.txt data2.txt 7) rm data1.txt data2.txt 8) rm data*.txt 9) rm -r mydirectory A) rm -rv mydirectory (-v 顯示詳細過程) B) rm -i *.txt (刪除前先確認) C) rm -rf * D) rm ./-p 如何建立/刪除減號 ( - ) 開頭的檔案, 目錄: 1) mkdir -- -p (建立 -p 資料夾) 2) touch ./-a (建立 -a 檔案) 3) rmdir ./-p (刪除 -p 資料夾) 4) rm -f -- -a (刪除 -a 檔案) ps. 若資料夾中含有 - 開頭的檔案, 則無法以 -rf 刪除, 必須先以上述方式 手動刪除 - 開頭檔案後, 才能以 -rf 強制全數刪除其他資料 *檔案目錄管理 範例: 1) mv myoldname mynewname (更名) 2) mv file.txt mydirname (搬移) 3) mv file1.txt file2.txt mydirname (搬移 file1.txt & file2.txt) 4) mv file.txt mydirname/file.doc (搬移+更名) 5) mv file1.txt file2.txt (file2.txt 被 file1.txt 覆蓋) 大量更名: 由於 mv 一次只能更名一個檔案, 若要大量更名, 須用 rename 指令: 範例: # touch test1.txt test2.txt test3.txt # rename .txt .doc * (*.txt 改成 *.doc) # rename test abc- * (test?.doc 改成 abc-?.doc) 連結檔 (link file): 種類項目: 1) symbolic link (符號連結, 縮寫為: symlink, 會佔用新的 inode) 2) hard link (硬連結, 不會佔用新的 inode) 建立方式: 1) symbolic link ==> ln -s source target 2) hard link ==> ln source target 差異與限制: 1) symbolic link a) 為名稱連結 b) 若參考來源遺失, 連結便失效 2) hard link a) 為實體檔案系統 inode 連結 b) 不支持對目錄進行 hard link c) 不支援跨分割區進行 hard link hard link 示意圖: oo##### oo##### oo##### oo##### oo = inode table (節點表格, 一個檔案佔一個節點編號) ## = data block (資料區塊) 程式項目: 1) df a) df ==> 檢示 data block 使用率 b) df -i ==> 檢示 inode table 使用率 2) ls a) ls -li ==> -i 參數表示列出使用的 inode 編號 範例: 找出 /bin 裡 inode 編號為 82852 的檔案 cd /bin ls -li | grep "82852" ==> 列出的檔案互為 hard link 裝置檔案: brwxr----- root disk 3, 0 hda (1)(2) 項目說明: 1) 主編號 (major number) 2) 次要編號 (minor number) 編號說明: 1) Linux 實際以主編號, 次要編號分辨實際應對的裝置為何 2) 編號規則可參閱: /usr/src/linux-2.4/Documentation 目錄的 devices.txt 檔案 範例: 1) mknod test.dat p (參數 p 表示 type 為 pipe line) 2) mkfifo test2.dat 3) mknod myhda b 3 0 (type 為 block, 編號: 3.0) ==> 須為 root 身份 4) mknod mypsaux c 10 1 (type 為 character, 編號: 10.1) ==> 須為 root 身份 5) /dev/MAKEDEV -d /root/tmp hda (在 /root/tmp 建立 hda* 裝置檔案) ==> root 6) /dev/MAKEDEV -d /root/tmp sda (比 mknod 要方便, 自動給予編號) ==> root cp 複製檔案: 1) cp /etc/fstab . 2) cp /etc/fstab fstab.txt (複製並更名) 3) cp /etc/passwd /etc/group /etc/wgetrc . (複製三個檔案到目前目錄) 4) cp -p /etc/fstab . (保留 權限, 時間標記) 5) cp -d /bin/view . (保留 symblink) 6) cp -R /bin . (把 /bin 這個目錄完整地複製過來) 7) cp -Rp /bin . 8) cp -R /dev/hda . (以 root 執行, 加 R 可複製裝置檔案) 9) cp -dpR /bin . (完整複製並保留 symblink, 時間標記..) A) cp -av /bin . (-a 相當於 -dpR) 練習: 於 ~/tmp 建立 test 目錄進行下列操作: 1) 建立如下目錄: test1, test2, test3/test4/test5 Ans) mkdir -p test1 test2 test3/test4/test5 2) 完整複製 /etc/passwd 至 test1 內 Ans) cp -p /etc/passwd ./test1 3) 於 test2 目錄完成如下檔案建立: a) regular file, filename: test1-1.dat Ans) touch test1-1.dat b) FIFO file, filename: test1-2.dat Ans) mknod test1-2.dat p (or mkfifo test1-2.dat) 4) 於 test3 目錄完成如下 link file: a) 建立 symblink, 名稱: test3-1.dat, 參考來源: test1 內的 passwd Ans) ln -s ../test1/passwd test3-1.dat b) 建立 hard link, 名稱: test3-2.dat, 參考來源: test2 內的 test1-1.dat Ans) ln ../test2/test1-1.dat test3-2.dat 5) 於 test3 目錄完整複製 test1 至 test5 目錄內 Ans) cp -dpR ../test1 ./test4/test5 (or -a) 6) 於 test3 目錄完整複製 test2 至 test4 目錄內, 新名稱為: test4-1 Ans) cp -dpR ../test2 ./test4/test4-1 (or -a) 7) 於 test3 目錄將 test2 內的 test1-1.dat 移至 test5 內, 新名稱為: test5-1 Ans) mv ../test2/test1-1.dat ./test4/test5/test5-1 8) 在 test 目錄當層, 將 test1 ~ test3 重新更名為 new-test1 ~ new-test3 Ans) rename test new-test * ps.皆以相對路徑進行操作 補充: 1) stat 可顯示檔案屬性 2) cat file.txt | nl 顯示時加上行號 3) tail -n 5 file.txt 最好加上 -n 4) tail +100 file.txt 顯示第100行到最後的資料 5) | (pipe line, 管線) 把前面的輸出交給後面的程式來處理 6) jmcce --> 終端模式的中文環境 7) expr 1 + 1 --> 可以計算運算結果 8) file filename --> 查看檔案格式 範例: 1) cat -n /etc/wgetrc > wgetrc.txt 2) cat -n /etc/wgetrc | less 3) ls -l /bin | less 4) ls -l /bin | cat -n (or | nl) 5) ls -l /bin | cat -n | head -n 8 6) ls -l /bin | cat -n | tail -n 5 7) 取指定檔案第 100 ~ 300 行內容 => cat -n /etc/termcap | head -n 300 | tail -n 201 => cat -n /etc/termcap | tail +100 | head -n 201 8) 取內容第 8 ~ 10 行內容 => cat -n /etc/passwd | head -n 10 | tail -n 3 > out1.txt => cat -n /etc/passwd | tail +8 | head -n 3 > out2.txt *VI Editor VI/VIM 三大模式切換: command mode <- (Esc); (i, a, o, I, A, O) -> insert mode command mode <- (Esc); (:) -> last mode 純文字檔換行差異示意圖: 1 ----------- 2 OOOOO------ 3 <-\r-|\n 註: \n 表示新行(LF); \r 表示歸位(CR) 開啟別人正在編輯中的檔案時: Edit anyway = 開啟原始檔案 Recover = 開啟 .swp 檔 (編輯中的版本) *GPM 說明: console 下 mouse 操作文字剪貼程式 程式啟動與關閉: /etc/rc.d/init.d/gpm start /etc/rc.d/init.d/gpm stop 設定每次開機是否啟動: 1) 執行 setup, 選 system service 進入, 選取 gpm 項目 2) 亦可直接執行 ntsysv 程式 滑鼠使用: 以 mouse 選取反白, 中鍵表示貼上 *Bash Shell Shell 程式示意圖: user -> shell -> kernel Shell 程式: 1) DOS: command.com 2) Win2K, XP: cmd.exe /etc/shells 記錄所有可用 shell 程式 變數差異示意: 1) local variable: (variable) -> A process -執行B程式-> B process <- (variable) 變數各自儲存於 shell 自己的內部記憶體內) 2) export variable (variable) -> A process -執行B程式-> B process 於環境變數區 複製繼承變數設定內容 於環境變數區 ps. 於 A export n, 在 B 看得到; B export n 改內容, exit 回到 A, 結果是無效的. 變數項目: 1) TERM: 終端機類型定義 終端機項目定義主機操作的畫面顯示的樣式定義, 包含鍵盤操作按鍵應對方式 常見項目: a. vt100 b. ansi 主機可用的終端機定義檔: /usr/share/terminfo 目錄 2) PATH: PATH=/bin:/usr/bin:/usr/local/bin 命令種類: a. 內建命令 (shell 內建指令) b. 外部命令 (外部程式檔案) 系統主要程式放置目錄: a. /bin, /usr/bin ==> 一般使用者 (依重要性分類) b. /sbin, /usr/sbin ==> 系統管理者 c. /usr/X11R6/bin ==> X window 相關程式 d. /usr/local/bin ==> 管理者另外安裝的程式 /usr/local/sbin 新增搜尋路徑: export PATH=$PATH:/path... 執行非未於 PATH 變數內的程式: a. 絕對路徑: /path/program b. 相對路徑: ./program (目前目錄內的程式) 新增搜尋目前工作目錄: export PATH=$PATH:. (把 . 加入 PATH 環境變數) export PATH=.:$PATH (不建議使用) 3) PS1 ~ PS4 說明: man bash, 尋找 PROMPTING 說明, 有完整跳脫字元使用方式 範例: a. PS1="Linux\u@\W> " b. PS1="C:\W> " c. PS1="\t\$ " jmcce 程式: a. 進入繁體中文 (jmcce 或 jmcce -b) b. 進入簡體中文 (jmcce -g) 系統整體 locale 設定: /etc/sysconfig/i18n 檔案 alias: a. alias cls=clear b. alias copy='cp -r' c. alias rm='rm -i' d. unalias copy ps. 用雙引號也可以, 但問題較多, 建議用單引號 補充: true > test.txt 可產生 0 byte 檔案 通配字元: 1) file? a) file (X) b) file. (O) c) filea (O) d) file.txt (X) 2) file* a) file (O) b) file. (O) c) filea (O) d) file.txt (O) 3) file[abc] ==> 符合項目: filea; fileb; filec 4) file[a-z] ==> 符合項目: filea; fileb;... filez (26個) (要由小到大, 不能 z-a) 5) file[a-zA-Z0-9] ==> 可以複合使用 (a~z; A~Z; 0~9) 6) file[!abc] ==> 符合項目: file? 但不含 filea ~ filec 7) file[!0-4] 8) file[^0-4] 9) *.* a) file (X) b) file. (O) c) file.txt (O) d) .file (X) ==> 隱藏檔 A) * a) file (O) b) file. (O) c) file.txt (O) d) .file (X) ==> 隱藏檔 列出隱藏檔的方法: 1) ls -al 2) ls .filename 3) ls .file* 4) ls .[!.]* 5) rm -rf * .[!.]* ==> 刪除所有檔案, 包括隱藏檔 字元順序: 表示使用: [a-z] zh_TW 環境: aAbB...zZ C; POSIX 環境: abcde...z 結論: 將 LC_COLLATE 的 i18n 變數調整為 C 或 POSIX 即可 參數展開: file.{txt,doc,ppt} 展開結果: file.txt, file.doc, file.ppt touch [a-c] ==> 產生 [a-c] 這個檔案 touch file.{a-z} ==> 產生 file.{a-z} 這個檔案 touch ?? ==> 如果沒有兩個字元的檔案, 會建立 ?? 這個檔案 讓 shell 程式忽略通配字元規則: 使用 " " 或 ' ' 等引號包起來即可 ex. touch "*" '?' (建議使用單引號, 最安全) 引號範例: 1) echo Hello World ==> 顯示 Hello World (只空一格) 2) echo 'Hello World' ==> 顯示 Hello World (空三格) 3) echo '$PATH' ==> 顯示 $PATH 這五個字元 (同 \$PATH) 4) echo "Hello World" ==> 顯示 Hello World (空三格) 5) echo "$PATH" ==> 顯示 $PATH 變數的內容 6) echo /bin/\* ==> 顯示 /bin/* 這幾個字元 7) ls -l /bin/ls /bin/gzip \ /bin/bash ==> 跳行繼續輸入命令 (此時的提示字元為: PS2) 8) echo "Current Time: `date`" 9) echo "Current Working Directory: `pwd`" A) echo "My account is $(whoami)" 練習: 執行 date 程式會顯示日期時間, 試問下列結果為何? 1) touch "date" ==> 建立 date 檔案 2) touch 'date' ==> 建立 date 檔案 3) touch `date` ==> 建立 星期, 日, 月, 年, 時間... 等6個檔案 4) touch $(date) ==> 同上 5) touch "`date`" ==> 建立一個以目前時間為檔名的檔案 6) touch "'date'" ==> 建立 'date' 檔案 7) touch '"date"' ==> 建立 "date" 檔案 8) touch '$(date)' ==> 建立 $(date) 檔案 9) touch "$(date)" ==> 建立一個以目前時間為檔名的檔案 alias 設定: 1) 統一放置於 ~/.bashrc 檔案, 於 interactive mode 可讀入執行 2) 由於 .bash_profile 亦讀入 .bashrc 檔案執行, 表示每次登入主機 亦會執行到 .bashrc 檔案 /etc/profile.d/ 目錄內的 script 檔案建立: 說明: 整體設定檔 (/etc/profile) 讓使用者每次登入主機 執行 shell 時讀辱入的組態設定 作法: 1) root 身份至 /etc/profile.d/ 建立一名稱為 .sh 結尾的檔案 其內容為: #! /bin/sh <-- 第一行 <-- 第二行留空白 程式碼內容 <-- 第三行 2) 完成儲存, 使用 chmod a+x filename.sh 設定為可執行權限 * Advanced Bash Shell 重新導向符號範例: 1) ls -l / > out.txt 2) cp --help > cp-help.txt 3) cp 2> cp-err.txt 4) ls -l /bin/gzip /bin/abc 1> out.txt 5) ls -l /bin/gzip /bin/abc 2> out.txt 6) ls -l /bin/gzip /bin/abc > out.txt 2>&1 7) ls -l /bin/gzip /bin/abc 1> /dev/null 8) ls -l /bin/gzip /bin/abc 2> /dev/null 9) ls -l /bin/gzip /bin/abc > /dev/null 2>&1 A) ls -l /bin/gzip /bin/abc 1> out.txt 2> err.txt ps. 若 1> 2> 都指向同個檔案, 則先處理右邊, 再處理左邊 --> 只剩 1> 的結果 B) cat < file.txt C) cat -n < file.txt D) cat -n << EOF E) cat -n << EOF > out.txt 差異說明: 1) cat file.txt ==> cat 程式自行開啟 file.txt 檔案, 再顯示內容於 stdout 2) cat < file.txt ==> cat 讀取 stdin, shell 將 file.txt 檔案內容置入 stdin 內 ps. echo y > yes.txt; rm -i file.txt < yes.txt (刪除 file.txt) 管線 (PIPE Line): 測試項目: 1) un-named pipe ls -l /bin | cat -n | tail -n 3 (cat -n; tail -n 3 ==> Filter, 過濾器) 2) named pipe 建立 FIFO 檔案: mkfifo data.dat 測試端(1): date > data.dat 測試端(2): cat data.dat Filter 範例: 1) ls /bin | wc -l (算出 /bin 檔案目錄總數) cut 程式: 字串:How are you    123456789AB 使用: 1) -c 1 => H 2) -c 1,3 => Hw 3) -c 1-3 => How 4) -c 5- => are you 5) -c -7 => How are 6) -d " " -f 1 => How (以空白為分格,取出第一欄) 7) -d " " -f 1,3 => How you 練習: 取出 ifconfig 中, eth0 的 IP Address (搭配: grep, cut 程式) Ans: /sbin/ifconfig eth0 | grep "inet addr" | cut -d : -f 2 | \ cut -d " " -f 1 ps. cut 有缺點: -d " " 時, 遇到多個空白 field 的計算會亂掉 替代方案為: awk (ex. ls -l | awk ' { print $1 }') 取第一個欄位 *網路工具 1) lynx: 文字介面瀏覽器 按鍵: a) 上,下鍵: 移動 b) 左,右鍵: 上一頁, 進入(Hyper-Link) c) o: 選項設定 d) q: 結束程式 使用方式: lynx http://tw.yahoo.com 設定檔: 整體: /etc/lynx.cfg 個人: ~/.lynxrc *使用者與群組管理 使用者與群組關係: UID:501 [peter] -> (GID:100) UID:502 [allen] -> (GID:100) => (GID:101) UID:503 [cox] -> (GID:101) 註: 1) []: 表示使用者 (user account) 2) <>: 表示群組 (group) 3) UID: User ID; GID: Group ID 4) ->: 主群組; => 附屬群組 系統管理者身份辨別: root: UID=0, GID=0 (UID=0 表示具備 root 權限) UID 相同環境: allen: UID=502 john: UID=502 (不同帳號, 但具備相同權限) 密碼編碼項目與特點: 1) 公式: DES, MD5 2) 特點: 單向編碼, 不可逆向還原 重設 root 密碼: 1) 重新開機至 GRUB 開機程式, 於 Fedora 項目按 e 鍵進入 2) 移至 kernel 項目, 按 e 鍵進入, 於尾輸入 single 再按 Enter 3) 按下 b 鍵進行開機, 於 sh# 下執行 passwd root 設定密碼 4) 完成後, 執行 exit 繼續開機 密碼格式與設定: 格式: 1) DES 2) MD5: $1... 指定儲存格式: 1) 執行 setup, 於 Auth... 項目進入修改 2) 完成結果於主機 /etc/pam.d/system-auth 檔案 shell 程式使用: 1) /sbin/nologin a) 禁止登入 b) 其他網路服務 (ftp, mail...) 可正常使用 2) /bin/false a) 同 nologin b) 提供內部使用的帳號, 不提供其他任何網路服務 範例: 1) useradd -g users -G mail,bin -s /bin/bash \ -c "Peter Chen" -d /home/peter peter 處理 userdel 未使用 -r 參數: 1) home: rm -rf /home/UserAccount 2) mail: rm -f /var/spool/mail/UserAccount 3) crontab (排程): rm -f /var/spool/cron/UserAccount (該項目加上 -r 亦不會刪除) 異動使用者帳號名稱: 1) usermod -d /home/UserAccount2 -m -l UserAccount2 UserAccount1 2) groupmod -n GroupName2 GroupName1 註: 1) usermod 異動 HOME 與 UserAccount (-m /home 裡的目錄名稱亦會更改) 2) groupmod 異動 group 名稱 使用者僅能修改如下設定: 1) Password (指令: passwd) 2) Shell (指令: chsh) 3) GECOS, finger information (指令: chfn) 帳號期限: chage -m 10 -M 60 -W 10 -E 2008-4-20 -I 20 peter ----1 ----2 ----3 -----------4 ----5 項目說明: 1) 密碼變更後, 必須等 10 天後才可再修改 2) 密碼每隔 60 天就過期, 必須重新設定密碼 3) 密碼過期前 10 天開始發出警告 4) 帳號僅可使用至 2008-4-20 這天 5) 密碼過期後再過 20 天便鎖住帳號 若帳號因 inactive 項目設定而被鎖住之處理: chage -d 2004-10-21 peter -今天日期- 練習: 1) 建立如下使用者: a) account: john b) main group: john c) other group: mail, bin, mylab d) shell: bash e) home: /home/john f) full name: john chen g) must change password: per 30 days h) lock account after password expired: 20 days i) account expired at: 2007-4-30 Ans: #groupadd john #groupadd mylab #useradd -G mail,bin,mylab -s /bin/bash -d /home/john -m john #chfn -f "john chen" john (亦可併於 useradd -c "john chen") #chage -M 30 -I 20 -E 2007-4-30 john 2) 修改原帳號成為如下: a) account: dean b) other group: mylab, users c) main group: dean (john -> dean) d) home: /home/dean e) full name: dean chen Ans: #usermod -l dean -G mylab,users -d /home/dean -m john #chfn -f "dean chen" dean (亦可併於 usermod -c "dean chen") #groupmod -n dean john *檔案系統權限管理: 長格式與權限檢視: drwxr-x--x peter users dirname 1--------2 ----3 ----4 1) 屬性 (attribute) 2) 權限 (permission) 3) 擁有者 (owner) 4) 所屬群組 (group) 權限應對: rwxr-x--x --1--2--3 1) owner 2) group 3) other 數字權限應對: r: 4, w: 2, x: 1 (2^2) (2^1) (2^0) 1) rwxr-x--x => 751 2) -wxr----- => 340 特殊權限(sStT): 1) rwsr-x--x => 4751 2) rwsr-s--t => 7751 3) rwS--s--T => 7610 4) rwx--Srwt => 3707 第一組號碼 = (s 於 owner = 4) + (s 於 group = 2) + (t 於 other = 1) 填入特殊權限(有 x 則小寫, 無 x 則大寫): rwxr-xrw- => rwsr-srwT 練習: 計算權限應對結果: 1) r-xrwx--x = 571 2) -wxrw---- = 360 3) 0472 = r--rwx-w- 4) 0654 = rw-r-xr-- 5) rwS--x--t = 5611 6) r-s--Sr-T = 7504 7) 6523 = r-s-wS-wx (較好做法: 先填 523, 再套 6) 8) 5746 = rwsr--rwT 程式項目: drwxr-xr-x root users name ---------1 ---2 ----3 1) chmod 2) chown 3) chgrp 範例: 1) 原本: rwxr-x--x 預期: r-x-wxrw- Ans: chmod 536 file Ans: chmod u-w,g-r+w,o+rw-x file 2) 原本: rwxr-x-w- 預期: rwsr-S--t Ans: chmod 7741 file Ans: chmod u+s,g-x+s,o-w+xt file 3) 原本: rws--srw- 預期: r---wS-wt Ans: chmod 3423 file Ans: chmod u-wsx,g+w-x,o-r+xt file 4) 原本: r-S-ws--x 預期: r-s-w-r-T Ans: chmod 5524 file Ans: chmod u+x,g-xs,o+r-x+t file 舊式 chown 用法: chown owner.group filename 建議避免使用, 因為有些平台可以建立含 . (點) 的帳號 新式用法為: chown owner:group filename 目錄無 x 權限: 若無 x 權限, r 與 w 無實質功能 範例: 某文字檔權限如下: rwxr-xr-- allen users file.txt 某目錄權限如下: rwxrwxr-x peter proxy dirname 情況: file.txt 位於 dirname 目錄 使用者清單: ID: cox, group: proxy 問題: 請問使用者是否具備以下權限? 1) 讀, 寫, 執行 file.txt 檔案 Ans: 唯讀 2) 刪除 file.txt 檔案 Ans: 可刪除 (by dir 權限) 範例: 使用者清單: ID: peter, group: users 程式檔清單: 1) rwxr-xr-x allen proxy prog1 2) rwsr-xr-x allen proxy prog2 3) rwxr-sr-x allen proxy prog3 問題: 使用者執行該程式檔, 執行期程式身份為何? Ans: 1) UID/GID/EUID/EGID 皆為 peter, users 2) UID=peter, GID=users, EUID=allen, EGID=users 3) UID=peter, GID=users, EUID=peter, EGID=proxy UID, GID ==> 執行者 EUID, EGID ==> 實際權限 umask 項目: 1) umask ==> 0002 目錄: 777-002 = 775 (rwxrwxr-x) (去除 other 的 w 權限) 檔案: 777-002 = 775 去除 x = 664 (rw-rw-r--) 2) umask ==> 0123 目錄: 777-123 = 654 (rw-r-xr--) 檔案: 777-123 = 654 去除 x = 644 (rw-r--r--) umask 設定: 1) 一般設定: umask = 002 umask = 022 2) 僅自己可存取: umask = 077 *檔案打包壓縮工具 gzip: .gz bzip2: .bz2 compress: .Z (gzip, gunzip, zcat 皆可支援) 壓縮率比較: bzip2 > gzip > compress 解壓縮工具對應: gzip => gunzip bzip2 => bunzip2 compress => uncompress 範例: 1) gzip file.txt => file.txt.gz 2) gzip -d file.txt.gz => file.txt 3) gzip -c file.txt > file.txt.gz => file.txt.gz (file.txt 存在) 4) gunzip file.txt.gz => file.txt 5) cat -n /etc/termcap | gzip > file.txt.gz (gzip -c 亦可) Ans: 將 termcap 加上列號, 並將結果壓縮成 file.txt.gz 6) gzip -dc file.txt.gz | wc -l Ans: 解壓縮 file.txt.gz 到標準輸出, 並統計內容列數 7) gzip -dc file.txt.gz > file.txt Ans: 解壓縮 file.txt.gz 到標準輸出, 並將解壓縮結果輸出到 file.txt 8) gzip -dc file.txt.gz | bzip2 > file.txt.bz2 Ans: 解壓縮 file.txt.gz 到標準輸出, 再壓縮成 bz2 格式 其他應對工具: 1) zcat => 相當 gzip -dc 2) bzcat => 相當 bzip2 -dc 範例: 1) tar cf bin.tar /bin 2) tar xf bin.tar 3) tar cvf bin.tar /bin 1>out.txt 2>err.txt 4) tar xvpf bin.tar 5) tar tvf bin.tar 6) tar tf bin.tar | grep "tcsh" 7) tar xvpf bin.tar bin/tcsh bin/vi bin/mail 8) tar zcvf bin.tar.gz /bin 9) tar jcvf bin.tar.bz2 /bin A) tar jxvpf bin.tar.bz2 B) tar cvf - /bin | gzip -c > bin.tar.gz (- = stdout) C) gzip -dc bin.tar.gz | tar xvpf - (- = stdout) D) tar cvf - /bin | (cd /tmp; tar xvpf -) 附檔名縮寫: 1) .tar.gz ==> .tgz 2) .tar.bz2 ==> .tbz .tb2 打包壓縮檔 (tarball file) zip 程式: 1) zip -ry bin.zip /bin 2) unzip bin.zip rar 程式: 取得站台: http://www.rarlab.com/ 安裝方式: 解開內容, 將 default.sfx rar unrar 程式複製到 /usr/local/bin rar 使用方法: 1) rar a bin.rar /bin 2) rar x bin.rar 3) rar a -ow -ol bin.rar /bin 4) rar x -ol bin.rar ps. -ow 保留 owner/group -ol 保留 symlink * 檔案搜尋工具 範例: 1) find /bin -type f -o type l (-o = or) 2) 搜尋 /bin 內檔案長度大於 100k 但小於 800k ==> find /bin -type f -size +100 -o -type f -size -800k 3) 搜尋 /bin 內 regular file, 名稱不包含 a-e 開頭項目 ==> find /bin -type f -name "[!a-e]*" 4) 搜尋無 owner, group 項目 ==> find /path -nouser -o -nogroup 5) drwxr-s--t peter users name ==> find /path -type d -perm 3751 -user peter -group users 6) find /bin -type f -exec ls -l {} \; ==> ls -l $(find /bin -type f) ==> find /bin -type f | xargs ls -l ==> find /bin -type f -print0 | xargs -0 ls -l 練習: 假設一路徑為 /path, 尋找該目錄與其下目錄完成如下要求功能 1) 目錄權限改成 751 2) 檔案權限改成 644 3) 附檔名為 .txt 使用 gzip 壓縮 4) 附檔名為 .dat, 並大小於 500k 使用 bzip2 進行壓縮 Ans: 1) find /path -type d | xargs chmod 751 find /path -type d -exec chmod 751 {} \; 2) find /path -type f | xargs chmod 644 find /path -type f -exec chmod 644 {} \; 3) find /path -type f -name "*.txt" -print0 | xargs -0 gzip 4) find /path -type f -name "*.dat" -size +500k -print0 | xargs -0 bzip2 * 工作與行程管理 名詞: 1) 工作 (job) 2) 行程 (process) 測試程式: 1) cp -av /usr . > out.txt 2>&1 (前景執行) 2) cp -av /usr . > out.txt 2>&1 & (背景執行, & 一定要擺最後面) 3) program > /dev/null 2>&1 & 應用實例: 使用 vi 寫程式, 按 Ctrl + Z 到 shell, 執行其他命令, 然後再 fg 回到 vi 環境繼續編輯. 行程運作圖: 1) 行程與行程 (PID, process ID) process PID=100 process PID=200 process PID=300 2) 行程關係, 通常父行程結束後, 其底下所有子行程亦一併結束 process (parent, 父行程, ex. bash) | v process (child, 子行程, ex. vim) 3) 執行程式建立行程 (1) process -- 執行 B 程式 (exec 呼叫) --> process A 行程以 exec 呼叫 B 程式後, A 行程即消失, 只剩 B 存在 實驗: 在 shell 中執行: exec program, 結束後即登出. 4) 執行程式建立行程 (2) process -- 執行 B 程式 (spawn 呼叫) --> process A 行程以 spawn 呼叫 B 行程後, A 行程仍存在 spawn = fork + exec 示意: A 行程 -fork-> B 行程 -exec-> C 行程 5) 行程自我複製 (fork 呼叫) process --> process | v process 記憶體使用率: /proc/meminfo (/proc 裡面的所有檔案皆在記憶體裡, 不會佔用硬碟空間) 行程執行狀態代碼: man ps, 尋找字串: "PROCESS STATE CODES" 信號 (signal): process A --SIGKILL (9)--> process C | SIGTERM (15) | v process B 發送 signal: 1) kill PID (預設為 SIGTERM) 2) kill -15 PID 3) kill -TERM PID SIGHUP signal: daemon --2.重讀--> 設定檔 ^ | 1.發送 | SIGHUP (1) signal 程式測試: 取回原始碼: lftp ftp://192.168.2.89 => cd /pub/signal => get signal-test.c 編譯測試: gcc signal-test.c ./a.out 範例: 1) pidof top | xargs kill 2) pgrep top | xargs kill 3) pgrep -U alex top | xargs kill 4) pgrep -U alex | xargs kill (同 kill $(pgrep -U alex)) 5) pkill top (與 killall top 相同) 6) pkill -U alex top 7) pkill -U alex 8) killall top xargs: build and execute command lines from standard input 1, 2, 5, 8 相同 3, 6 相同 4, 7 相同 優先等級/優先權 (priority): 範圍表示: -20 (高優先權) | | | 0 (預設) | | | 19 (低優先權) * RPM套件管理程式 傳統 UNIX 系統軟體安裝方式: source code --complie,link--> binary code (原始碼) (目的平台程式碼) 項目說明: 1) GCC (GNU Compiler Collection) ==> GNU 出品的相關程式發展套件環境 ==> 包含 C, C++, fortran, java 編譯器 2) C, C++ 編譯器程式 ==> gcc (GNU C Compiler) ==> g++ (GNU C++ Compiler) nmap 軟體取得: http://www.insecure.org/nmap/ ftp://192.168.2.89/pub/nmap/ 軟體編譯安裝方式: 1) 解開打包檔, 檢視是否提供 README, INSTALL 文件 2) 目前大部份軟體已整合 autoconf, automake, 一般編譯 步驟如下: ./configure --prefix=/path (可使用 /usr/local/xxx) make (依 configure 產生 Make file 進行編譯) make install (安裝至目的目錄) Fedora Linux Core 1 套件檔案: ftp://linux.sinica.edu.tw/fedora/linux/core/1/i386/os/Fedora/RPMS/ ftp://ftp.isu.edu.tw/pub/Linux/Fedora/linux/core/1/i386/os/Fedora/RPMS/ RPM 套件分類: source rpm (.src.rpm) --> binary rpm (x86: .i386.rpm .i686.rpm) | v noarch rpm (.noarch.rpm) 套件相依性關係圖: A |- B | |- D | |- E |- C |- F 說明: 1) 表示 A 需要 B, C 搭配 2) 表示 B 需要 D, E 搭配 3) 表示 C 需要 F 搭配 套件移除 (沒有 --force 項目): 1) rpm -e A 2) rpm -e B (相依性錯誤-- A require B) 3) rpm -e A B (一起移除滿足相依性) 4) rpm -e --nodeps B (忽略相依性) 套件安裝: 1) rpm -ivh A-1.0-1.i386.rpm 2) rpm -ivh --nodeps A-1.0-1.i386.rpm (強迫安裝A,忽略對B相依性要求) rpm -ivh A-1.0-1.i386.rpm B-1.0-1.i386.rpm 3) rpm -ivh --force A-1.0-1.i386.rpm (再次安裝A,覆寫原A套件所有檔案) 強迫移除 A: 1) rpm -e A 錯誤 2) rpm -e --nodeps A 正確 3) rpm -e --force A 錯誤 4) rpm -e --force --nodeps A 錯誤 5) rpm -e --nodeps A-1.0-1 正確 6) rpm -e --nodeps A-1.0-1.i386.rpm 錯誤 取得 Fedora Core 1 Updates 套件: ftp://linux.sinica.edu.tw/fedora/linux/core/updates/1/i386 rpm -V 確認使用事宜: 1) 設定檔被異動為正常 2) 程式檔案, 程式庫檔案被異動表示檔案損壞或被置換過, 有安全性問題. up2date 程式指定是否包含更新核心項目: 設定檔: /etc/sysconfig/rhn/up2date 項目內容: => pkgSkipList=; => pkgToInstallNotUpdate=; 安裝/更新指定套件: up2date xxxxx yum install xxxxx * 網路概論 網路拓撲: 1) bus: 使用 RG58 同軸電纜連結, 終端使用終端電阻(50歐姆). 2) star 3) ring: 使用雙網連結(非 Ethernet, 無 Hub, 網路卡亦不同) 4) hybrid 項目列表: 1) 增益器 (Repeater) 2) 集線器 (Hub) 3) 埠 (port) 4) Hub 共享頻寬: 10M, 100Mbps 5) 乙太網路 (Ethernet) 6) 路由器 (Router) 7) 交換器 (Switch) 8) Switch Hub ==> 屬於 Hub, 只具有 Switch 的部份功能 9) IP Sharing ==> Router + NAT + Hub 網路管理模式: 1) Server / Client (主從架構) => Web Service, Mail Service... 2) Peer / Peer (點點架構, 與 point to point 點對點 不同!) => 互為 Client 與 Server, 如 P2P Network: eDonkey, eMule, BT... 通訊協定: 1) NETBIOS (network basic input output system) IBM 發展, Microsoft 發揚光大 以 netbios name 為 node 辨視 缺點: 1.採廣播方式通知上線, 主機不能超過 255 台, 否則網路效率奇差無比 2.無法跨網段 * wins server (windows internet name service) 提供 netbios name 註冊, client 可向 wins server 查詢線上主機, 以減少封包廣播. IP位址: 192.168.2.100 (32bit) IPv6 (128bit) 比 IPv4 (32bit) 多了 2 ^ (128-32) 個 IP Address 檢視主機 IP 位址: /sbin/ifconfig 讓 Linux 主機載入 IPv6 支援: modprobe ipv6 台灣 IPv6 專案站台: http://www.ipv6.org.tw/ IPv4 表示: 11111111 11111111 11111111 11111111 8bit 8bit 8bit 8bit 變化性: 2 ^ 8 => 256 (0 ~ 255) IPv4 IP 範圍: 0.0.0.0 ~ 255.255.255.255 IP 分級: Class A: (0 開頭, netmask: 255.0.0.0) 11111111 11111111 11111111 11111111 NetID HostID-> Class B: (10 開頭, netmask: 255.255.0.0) 11111111 11111111 11111111 11111111 NetID HostID-> Class C: (110 開頭, netmask: 255.255.255.0) 11111111 11111111 11111111 11111111 NetID HostID-> Class A IP 範圍: 00000000 (2進位) => 0 (10進位) 01111111 (2進位) => 127 (10進位) => 0.xxx.xxx.xxx ~ 127.xxx.xxx.xxx Class B IP 範圍: 10000000 (2進位) => 128 (10進位) 10111111 (2進位) => 191 (10進位) => 128.xxx.xxx.xxx ~ 191.xxx.xxx.xxx Class C IP 範圍: 11000000 (2進位) => 192 (10進位) 11011111 (2進位) => 223 (10進位) => 192.xxx.xxx.xxx ~ 223.xxx.xxx.xxx 問題: 168.95.1.1, 為哪級 IP? Ans: B 級 AND 運算 (0最大, 兩者皆為 true 時才為 true): 0 & 0 => 0 0 & 1 => 0 1 & 1 => 1 (任何數字與 1 AND 永遠得到自己) (任何數字與 0 AND 永遠得到0) IP 與 netmask 進行 AND 運算: (AND 運算後所得到的 IP 為 IP 起始為址) IP: 10.xxx.xxx.xxx netmask: 255.0.0.0 運算: 10.0.0.0 & 255.0.0.0 => 10.0.0.0 10.0.0.1 & 255.0.0.0 => 10.0.0.0 10.0.0.2 & 255.0.0.0 => 10.0.0.0 . 10.255.255.255 & 255.0.0.0 => 10.0.0.0 IP: 192.168.2.xxx netmask: 255.255.255.0 運算: 192.168.2.0 & 255.255.255.0 => 192.168.2.0 192.168.2.1 & 255.255.255.0 => 192.168.2.0 192.168.2.2 & 255.255.255.0 => 192.168.2.0 . 192.168.2.255 & 255.255.255.0 => 192.168.2.0 => IP 範圍: 192.168.2.0 ~ 192.168.2.255 192.168.2.0 => 網段起始位址 192.168.2.255 => 網段廣播位址 => IP 範圍表示1: 192.168.2.0/255.255.255.0 => IP 範圍表示2: 192.168.2.0/24(NetID內,1所佔的總數) subnet 與 netmask: Class C: (255.255.255.0) 11111111 11111111 11111111 11111111 NetID--------------------- HostID => 將 HostID 借位給 NetID Class C: (255.255.255.128) 11111111 11111111 11111111 11111111 NetID-----------------------HostID (NetID 向 HostID 借了 1 位) 10000000 (2進位) => 128 (10進位) IP 計算: IP: 192.168.2.xxx netmask: 255.255.255.128 192.168.2.0 & 255.255.255.128 => 192.168.2.0 192.168.2.1 & 255.255.255.128 => 192.168.2.0 . 192.168.2.127 & 255.255.255.128 => 192.168.2.0 192.168.2.128 & 255.255.255.128 => 192.168.2.128 192.168.2.129 & 255.255.255.128 => 192.168.2.128 . 192.168.2.255 & 255.255.255.128 => 192.168.2.128 => 第一段: 192.168.2.0 ~ 192.168.2.127 => 第二段: 192.168.2.128 ~ 192.168.2.255 => IP 範圍(1): 192.168.2.0/255.255.255.128 (or /25) => IP 範圍(2): 192.168.2.128/255.255.255.128 (or /25) subnet IP 計算: IP: 192.168.2.xxx netmask: 255.255.255.240 => 每個 subnet IP 數 = 256 - 240 = 16 IP / subnet => subnet 總數 = 256 / 16(每個 subnet IP 數) = 16 subnet => 要給 8 個 IP, 要用哪種遮罩? 256 - 8 = 248 IP: 172.16.xxx.xxx netmask: 255.255.192.0 => 第一段: 172.16.0.0 ~ 172.16.63.255 => 第二段: 172.16.64.0 ~ 172.16.127.255 => 第三段: 172.16.128.0 ~ 172.16.191.255 => 第四段: 172.16.192.0 ~ 172.16.255.255 IP: 10.xxx.xxx.xxx netmask: 255.248.0.0 => 第一段: 10.0.0.0 ~ 10.7.255.255 (10.0.0.0/13) => 第二段: 10.8.0.0 ~ 10.15.255.255 (10.8.0.0/13) => 第三段: 10.16.0.0 ~ 10.23.255.255 (10.16.0.0/13) . => 第31段: 10.240.0.0 ~ 10.247.255.255 (10.240.0.0/13) => 第32段: 10.248.0.0 ~ 10.255.255.255 (10.248.0.0/13) 不分級 IP: IP: 10.xxx.xxx.xxx netmask: 255.255.248.0 => 第一段: 10.0.0.0 ~ 10.0.7.255 (10.0.0.0/21) IP: 140.113.xxx.xxx netmask: 255.255.0.0 => 第一段: 140.113.0.0 ~ 140.113.255.255 (140.113.0.0/16) IP: 140.113.23.xxx netmask: 255.255.255.0 => 第一段: 140.113.23.0 ~ 140.113.23.255 (140.113.23.0/24) IP: 61.16.0.xxx netmask: 255.255.255.248 => 61.16.0.0 ~ 61.16.0.7 (61.16.0.0/29) TCP/IP Model: 1) 網路存取層 client A: IP=192.168.1.1; MAC=00:48:54:5A:63:8E client C: IP=192.168.1.2; MAC=00:48:54:3A:82:4A A 要傳跟 C 聯繫前, 會以 "ARP 廣播" 查詢 C 的 MAC 資料, 所查詢到的結果會暫存到 ARP Table, 下次要再跟 C 聯繫時, 就不用再廣播查詢. 相關指令: arping 以 ARP 廣播封包詢問某 IP 的 MAC arp -n 列出 ARP Table 資料 (-n 以 IP 列出) ping 先以 ARP 廣播封包探查某 IP 的 MAC 後, 再 持續傳送 ICMP 封包. 2) 網路層 IP 封包 (IP Packet): a) Protocol (/etc/protocols) b) Source Address c) Destination Address 3) 傳輸層 a) Protocol: TCP/UDP b) 連接埠 (port) (/etc/services) 程式使用: 1) telnet www.hinet.net 80 2) netstat -tun 4) 應用層 各種協定協議溝通方式 (程式之間) * Linux 網路設定 1) /etc/services well-known port (0~1023 port) 項目: a) port 21: ftp b) port 22: ssh c) port 23: telnet d) port 25: smtp e) port 53: domain f) port 80: www g) port 110: pop3 h) port 119: netnews i) port 143: imap4 ps. 通常說: 1024 port, 但不含第 1024! 2) /etc/hosts 127.0.0.1 localhost.localdomain localhost 192.168.20.1 www.test.com 192.168.20.2 ftp.test.com (127.0.0.1 千萬不能砍掉!) 3) /etc/host.conf order hosts,bind,nis 4) /etc/resolv.conf domain lccnet.sayya.org (設定本地 domain name)* search lccnet.sayya.org hinet.net (設定 domain 搜尋順序)** nameserver 192.168.2.1 (名稱伺服器,DNS) nameserver 168.95.1.1 (一個 DNS 一行) *ping www ==> ping www.lccnet.sayya.org **ping www ==> 若 www.lccnet.sayya.org 不存在, 套用下一個 ***domain 與 search 擇一使用, 若同時使用, 只有最後一個生效 主機名稱組成: www.seed.net.tw --1 ----------2 1=short hostname 2=domain name => hostname=short hostname + domain name 網路組態項目: 1) IP Address (/etc/sysconfig/network-scripts/ifcfg-eth0) 2) netmask (/etc/sysconfig/network-scripts/ifcfg-eth0) 3) default gateway (/etc/sysconfig/network) 4) dns (/etc/resolv.conf) 5) hostname (/etc/sysconfig/network) 6) domain name (/etc/sysconfig/network) 網路連線 IP 設定配置方式: 1) static IP (靜態 IP) 2) DHCP (透過 dhcp 主機分配 IP) 3) Dialup (撥接) 檢視網路組態: 1) IP, network, broadcast ==> ifconfig 2) default gateway ==> route -n 3) dns ==> /etc/resolv.conf 內的 nameserver 項目 重新載入網路設定: /etc/rc.d/init.d/network restart 停用網路卡: ifdown eth0 啟用網路卡: ifup eth0 IP Alias (IP 別名): 說明: 提供一網路介面可設定具備多組 IP 介面名稱: eth[0-9]:[0-9] 設定方式: ifconfig eth0:1 10.0.0.1... (只要 up/down eth0 即可生效) 網路卡驅動檢視: 1) ifconfig -a lsmod | grep "8139too" ifconfig eth0 down rmmod 8139too ifconfig -a 2) modprobe 8139too lsmod | grep "8139too" ifconfig -a 取得 module 內容描述說明: for name in $(find . -type f) do echo "Filename: $name" modinfo -d "$name" done > /tmp/out.txt * xinetd 服務程式 程式使用: 1) netstat -ntu (n=numeric; t=TCP; u=UDP) 2) netstat -ntupl (l=listen; p=program name) 3) nmap 192.168.2.1 (scan TCP port) 4) nmap -sU 192.168.2.1 (scan UDP port) 練習: 關閉原 port 23 的 telnet 登入, 另外於 port 30000 提供 telnet 登入. Ans: 1) vi /etc/services, 加入 telnet2 30000/tcp 2) cp /etc/xinetd.d/telnet /etc/xinetd.d/telnet2 3) vi /etc/xinetd.d/telnet2, 修改: service telnet -> service telnet2 disable = yes -> disable = no 4) /etc/rc.d/init.d/xinetd reload 練習: 於 port 30001 提供一服務, 列出主機行程執行列表 (ps aux) Ans: 1) vi /etc/services, 加入 psaux 30001/tcp 2) cp /etc/xinetd.d/telnet /etc/xinetd.d/psaux 3) vi /etc/xinetd.d/psaux, 修改: service telnet -> service psaux disable = yes -> disable = no server = ... -> server = /bin/ps server_args = aux 4) /etc/rc.d/init.d/xinetd reload 練習: 開放 port 23 telnet 登入, 但是特別設定 192.168.2.89 禁止連入, 使用該服務進行登入. 測試方式: 以 lccnet 帳號用 ssh 登入 192.168.2.89 後再使用 telnet 連線至自己主機, 即可知道是否設定成功. tcp wrapper 設定: (先讀 /etc/hosts.allow 再看 /etc/hosts.deny) 1) 範例 1 /etc/hosts.deny: in.telnetd: ALL /etc/hosts.allow: in.telnetd: 192.168.2. Ans: 僅接受 192.168.2.xxx 連線 telnet 2) 範例 2 /etc/hosts.deny: in.telnetd: ALL EXCEPT 192.168.2. /etc/hosts.allow: 無任何 in.telnetd 項目設定 Ans: 僅接受 192.168.2.xxx 連線 telnet 3) 範例 3 /etc/hosts.deny 無任何 in.telnetd 項目設定 /etc/hosts.allow in.telnetd: ALL EXCEPT 192.168.2. Ans: 所有 IP 都接受連線 telnet telnet 服務: 套件項目: telnet-server 服務啟動: 透過 xinetd 程式管理 ssh 服務存取控管: sshd 可支援整合使用 tcp wrapper 功能 * DNS 服務架設 hosts.txt (A 單位): 192.168.2.1 peter 192.168.2.2 allen 192.168.2.3 cox hosts.txt (B 單位): 192.168.3.1 mary 192.168.3.2 peter 192.168.3.3 john NIC (Network Information Center) ==> 維護 hosts.txt 檔案 網域相關資料: 1) domain name: helloit.com.tw 2) domain name server: a) dns.helloit.com.tw 210.242.1.1 (master) b) dns2.helloit.com.tw 210.242.1.2 (slave) 3) 管轄設定資料: a) www.helloit.com.tw 210.242.1.100 b) ftp.helloit.com.tw 210.242.1.101 dns 服務啟動準備: 1) /etc/sysconfig/named 修改如下: #ROOTDIR=/var/named/chroot 2) 啟動 named 程式 /etc/rc.d/init.d/named start 3) 修改 /etc/resolv.conf 的 nameserver: nameserver 127.0.0.1 (其他 nameserver 先加上 #) 4) 執行 nslookup 測試 nslookup www.seed.net.tw named.conf 註解表示: 1) C 語言註解 /* comment */ 2) C++ 語言註解 // comment 註: 1) C 註解可跨多行; 2) C++ 註解僅用於單行 TTL 項目說明: 環境: client 向 dns.hinet.net 主機查詢資料 helloit.com.tw zone 的 TTL 為 1 day. 查詢情況: 11/25 08:00 www.helloit.com.tw => 210.242.1.100 (第一次詢問結果) 11/25 10:00 www.helloit.com.tw => 210.242.1.100 (快取記憶體結果) 11/25 16:00 www.helloit.com.tw IP 異動為 210.242.1.200 11/25 19:30 www.helloit.com.tw => 210.242.1.100 (快取) 11/26 08:01 www.helloit.com.tw => 210.242.1.200 (第一次) * Apache Web Server 連線 url 使用表示: 1) http://www.foo.com/ (port 80) 2) https://www.foo.com/ (port 443) 3) http://www.foo.com:3128/ (port 3128) client 瀏覽器: 1) lynx 2) mozilla, firefox (http://www.mozilla.org/) Web 主機網路環境: 1) IP: 192.168.2.xxx 2) hostname: ip-xxx.lccnet.sayya.org 提供 webadm 帳號管理站台: 1) 新增 webadm account: adduser webadm passwd webadm 2) 設定網頁目錄權限給 webadm chown webadm:webadm /var/www/html 3) 以 webadm 登入主機, 切換至 /var/www/html 目錄 可管理檔案. fedora linux core ftp service: 套件名稱: vsftpd * Apache Web Server 虛擬主機 (Virtual Host): 說明: 提供一台 Web 主機放置多個 Web Site 站台功能 分類: 1) IP-Based Virtual Host 2) Name-Based Virtual Host 分類說明: 1) IP-Based Virtual Host www.foo.com 192.168.1.1 www.bar.com 192.168.1.2 2) Name-Based Virtual Host www.foo.com 192.168.1.1 www.bar.com 192.168.1.1 ps. 若以 ip 連線, 則預設連結第一台 (foo) Virtual Host 示意圖: Web 主機 (www.foo.com; www.bar.com) client 1: 存取 http://www.bar.com/ client 2: 存取 http://www.foo.com/ 補充說明: 1) lynx -dump http://xxx.xxx.xxx 可將網頁顯示內容 dump 到 stdout 2) wget http://xxx.xxx.xxx 會抓取網頁內容 (html tags) 3) 以 lynx 連接時, ~/foo access_log 會有兩筆記錄, ~/foo/ 只有一筆 4) 以 firefox 連接時, 會有 ~/jamyy 與 /favicon.ico 兩筆記錄 Alias 使用範例: Alias /jamyy /home/jamyy/public_html *網路工具 1) wget 說明: http, ftp 協定檔案抓取工具 使用說明: wget http://www.hinet.net/ wget ftp://hostname/pub/test.tar wget -c ftp://... 續傳 (-c = continue get) wget -m http://... 砍站 (-m = mirror mode) wget -m ftp://... 抓取 ftp 站台所有檔案 2) lftp 說明: 交談互動模式檔案傳輸程式 (支援 ftp, http 協定) 使用方式: lftp ftp://hostname/ lftp http://hostname/ lftp ftp://ID@hostname/ * Mail 服務架設 Mail 服務運作流程: ps. 流程圖參見講義 MX 記錄項目: 寄信至目的 e-mail 信箱 1) ID@hotmail.com 2) ID@yahoo.com.tw 透過 dns 服務查詢 hotmail.com 是否有 MX 記錄: ==> 有 MX 記錄, 依據 MX 記錄投遞 ==> 無 MX 記錄, 依據 A 記錄投遞 <<重要>> 通常 MX 數值最小的那個是真正的 mail server, 其他的都是它的 "鄰居"; 當真正的 mail server 當機時, "鄰居" 會幫忙保管郵件, 等真正的 mail server 恢復時, 再寄回去. (參閱 Mail Server 講義 p.15, p.16) Mail 主機網路環境: 1) IP: 192.168.2.131 2) hostname: ip-131.lccnet.sayya.org 3) e-mail: ID@ip-131.lccnet.sayya.org 多重主機名稱 Mail 服務環境: 1) 主 hostname: ip-131.lccnet.sayya.org (192.168.2.131) 2) 其他指向相同主機名稱: www.ip-131.lccnet.sayya.org (192.168.2.131) w3.ip-131.lccnet.sayya.org (192.168.2.131) mailertable, smart relay 功能使用: 1) 原本信件處理投遞流程: MUA -> mail.foo.com -> mail.bar.com 2) 設定 mailertable 功能: mail.bar.com smtp:[mail.xyz.com] 3) mailertalble 設定後流程: MUA -> mail.foo.com -(1)-> mail.xyz.com -(2)-> mail.bar.com 其中, mail.xyz.com 為 relay host 4) 設定 smart relay 功能: 修改 sendmail.cf 內 DS[mail.xyz.com] 敘述 5) smart relay 設定後流程 MUA -> mail.foo.com -> mail.xyz.com -> 目的任何 mail 主機 其中, mail.xyz.com 為 smart relay host * DHCP Server 架設 DHCP 環境 IP 分配規劃: IP: 10.0.0.0/255.0.0.0 => 一般保留 1/5 ~ 2/5 IP 不分配 * Firewall / NAT 撰寫 shell script: 1) 檔案第一行格式內容 #!/bin/sh 2) 程式碼由第三行開始 3) 完成儲存, 設定可執行 chmod a+x filename.sh 4) 執行測試之 ./filename.sh 禁止別人連入, 但自己可連線別人的方法: iptables -A INPUT -s msa.hinet.net -m state --state NEW -j DROP (需載入 ip_conntrack 模組) 練習: 1) 設定禁止所有 ping 封包傳入, 但來源為 192.168.2.0/24 IP 不在此限 2) 設定禁止 168.95.1.1 IP 不可存取本機, 但本機可存取該 IP 主機 3) 主機只對外開放 ssh 服務, 其他不對外開放 iptables -A INPUT -s ! 192.168.2.0/24 -p icmp \ --icmp-type echo-request -j DROP iptables -A INPUT -s 168.95.1.1 -m state --state NEW -j DROP iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -m state --state NEW -j DROP Firewall 環境與 FTP 服務: FTP 服務協定通道: 1) command channel => port 21 2) data channel => 隨機 port FTP 資料傳輸協議方式: 1) active mode 2) passive mode 協議方式說明: 1) active mode client 端告知 server 端將資料傳送至 client 端的指定 port 進行傳輸 2) passive mode server 端告知 client 端連線至 server 端指定 port 進行資料傳輸 練習: 1) 設定主機完全禁止外來連線, 但本機可正常連外. 請分別設定 INPUT 的 policy 為 ACCEPT 與 DROP 時, 滿足上述需求 2) 設定主機僅開放 port 25, 其他主機連入的連線皆禁止. 3) 以 ftp 指定連至 linux.sinica.edu.tw 主機時, 用 passive 與 active mode 皆可傳輸資料. 註: 測試方式: 1) ssh 至 192.168.2.151 主機, 反過來連自己主機確認是否成功. 2) 連線至自己的主機測試, 可使用 telnet 來進行連線. Ans: iptables -t filter -P INPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 25 -j ACCEPT iptables -A INPUT -m state --state NEW -j DROP iptables -t filter -P INPUT DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p tcp --dport 25 -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT NAT 功能說明: 1) SNAT 情況: source ip: 192.168.1.1 destination ip: 168.95.1.1 -- SNAT --> source ip: 210.242.1.253 destination ip: 168.95.1.1 2) DNAT 情況: source ip: 168.95.1.1 destination ip: 210.242.1.253 -- DNAT --> source ip: 168.95.1.1 destination ip: 192.168.1.1 (也可以對應到某個 port 再轉到特定內部 ip)