<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 16.4 特殊文件與程序 我們在[第六章曾經談到特殊權限的 SUID/SGID/SBIT](../Text/index.html#suid_sgid_sbit) ,雖然第六章已經將這三種特殊權限作了詳細的解釋,不過,我們依舊要來探討的是,那么到底這些權限對于你的“程序”是如何影響的? 此外,程序可能會使用到系統資源,舉例來說,磁盤就是其中一項資源。哪天你在 umount 磁盤時,系統老是出現“ device is busy ”的字樣~到底是怎么回事啊?我們下面就來談一談這些和程序有關系的細節部分: ### 16.4.1 具有 SUID/SGID 權限的指令執行狀態 SUID 的權限其實與程序的相關性非常的大!為什么呢?先來看看 SUID 的程序是如何被一般使用者執行,且具有什么特色呢? * SUID 權限僅對二進制程序(binary program)有效; * 執行者對于該程序需要具有 x 的可執行權限; * 本權限僅在執行該程序的過程中有效 (run-time); * 執行者將具有該程序擁有者 (owner) 的權限。 所以說,整個 SUID 的權限會生效是由于“具有該權限的程序被觸發”,而我們知道一個程序被觸發會變成程序, 所以啰,執行者可以具有程序擁有者的權限就是在該程序變成程序的那個時候啦!第六章我們還沒談到程序的概念, 所以你或許那時候會覺得很奇怪,為啥執行了 passwd 后你就具有 root 的權限呢?不都是一般使用者執行的嗎? 這是因為你在觸發 passwd 后,會取得一個新的程序與 PID,該 PID 產生時通過 SUID 來給予該 PID 特殊的權限設置啦! 我們使用 dmtsai 登陸系統且執行 passwd 后,通過[工作控制](../Text/index.html#background)來理解一下! ``` [dmtsai@study ~]$ passwd Changing password for user dmtsai. Changing password for dmtsai (current) UNIX password: &lt;==這里按下 [ctrl]-z 并且按下 [enter] [1]+ Stopped passwd [dmtsai@study ~]$ pstree -uA systemd-+-ModemManager---2*[{ModemManager}] ....(中間省略).... &#124;-sshd---sshd---sshd(dmtsai)---bash-+-passwd(root) &#124; `-pstree ....(下面省略).... ``` 從上表的結果我們可以發現,底線的部分是屬于 dmtsai 這個一般帳號的權限,特殊字體的則是 root 的權限! 但你看到了, passwd 確實是由 bash 衍生出來的!不過就是權限不一樣!通過這樣的解析, 你也會比較清楚為何不同程序所產生的權限不同了吧!這是由于“SUID 程序運行過程中產生的程序”的關系啦! 那么既然 SUID/SGID 的權限是比較可怕的,您該如何查詢整個系統的 SUID/SGID 的文件呢? 應該是還不會忘記吧?使用 [find](../Text/index.html#find) 即可啊! > find / -perm /6000 ### 16.4.2 /proc/* 代表的意義 其實,我們之前提到的所謂的程序都是在內存當中嘛!而內存當中的數據又都是寫入到 /proc/* 這個目錄下的,所以啰,我們當然可以直接觀察 /proc 這個目錄當中的文件啊! 如果你觀察過 /proc 這個目錄的話,應該會發現他有點像這樣: ``` [root@study ~]# ll /proc dr-xr-xr-x. 8 root root 0 Aug 4 18:46 1 dr-xr-xr-x. 8 root root 0 Aug 4 18:46 10 dr-xr-xr-x. 8 root root 0 Aug 4 18:47 10548 ....(中間省略).... -r--r--r--. 1 root root 0 Aug 5 17:48 uptime -r--r--r--. 1 root root 0 Aug 5 17:48 version -r--------. 1 root root 0 Aug 5 17:48 vmallocinfo -r--r--r--. 1 root root 0 Aug 5 17:48 vmstat -r--r--r--. 1 root root 0 Aug 5 17:48 zoneinfo ``` 基本上,目前主機上面的各個程序的 PID 都是以目錄的型態存在于 /proc 當中。 舉例來說,我們開機所執行的第一支程序 systemd 他的 PID 是 1 , 這個 PID 的所有相關信息都寫入在 /proc/1/* 當中!若我們直接觀察 PID 為 1 的數據好了,他有點像這樣: ``` [root@study ~]# ll /proc/1 dr-xr-xr-x. 2 root root 0 Aug 4 19:25 attr -rw-r--r--. 1 root root 0 Aug 4 19:25 autogroup -r--------. 1 root root 0 Aug 4 19:25 auxv -r--r--r--. 1 root root 0 Aug 4 18:46 cgroup --w-------. 1 root root 0 Aug 4 19:25 clear_refs -r--r--r--. 1 root root 0 Aug 4 18:46 cmdline &lt;==就是指令串 -r--------. 1 root root 0 Aug 4 18:46 environ &lt;==一些環境變量 lrwxrwxrwx. 1 root root 0 Aug 4 18:46 exe ....(以下省略).... ``` 里面的數據還挺多的,不過,比較有趣的其實是兩個文件,分別是: * cmdline:這個程序被啟動的指令串; * environ:這個程序的環境變量內容。 很有趣吧!如果你查閱一下 cmdline 的話,就會發現: ``` [root@study ~]# cat /proc/1/cmdline /usr/lib/systemd/systemd--switched-root--system--deserialize24 ``` 就是這個指令、選項與參數啟動 systemd 的啦!這還是跟某個特定的 PID 有關的內容呢,如果是針對整個 Linux 系統相關的參數呢?那就是在 /proc 目錄下面的文件啦!相關的文件與對應的內容是這樣的: [[3]](#ps3) | 文件名 | 文件內容 | | --- | --- | | /proc/cmdline | 載入 kernel 時所下達的相關指令與參數!查閱此文件,可了解指令是如何啟動的! | | /proc/cpuinfo | 本機的 CPU 的相關信息,包含頻率、類型與運算功能等 | | /proc/devices | 這個文件記錄了系統各個主要設備的主要設備代號,與 [mknod](../Text/index.html#mknod) 有關呢! | | /proc/filesystems | 目前系統已經載入的文件系統啰! | | /proc/interrupts | 目前系統上面的 IRQ 分配狀態。 | | /proc/ioports | 目前系統上面各個設備所配置的 I/O 位址。 | | /proc/kcore | 這個就是內存的大小啦!好大對吧!但是不要讀他啦! | | /proc/loadavg | 還記得 [top](../Text/index.html#topm) 以及 [uptime](../Text/index.html#uptime) 吧?沒錯!上頭的三個平均數值就是記錄在此! | | /proc/meminfo | 使用 [free](../Text/index.html#free) 列出的內存信息,嘿嘿!在這里也能夠查閱到! | | /proc/modules | 目前我們的 Linux 已經載入的模塊列表,也可以想成是驅動程序啦! | | /proc/mounts | 系統已經掛載的數據,就是用 mount 這個指令調用出來的數據啦! | | /proc/swaps | 到底系統掛載入的內存在哪里?呵呵!使用掉的 partition 就記錄在此啦! | | /proc/partitions | 使用 fdisk -l 會出現目前所有的 partition 吧?在這個文件當中也有紀錄喔! | | /proc/uptime | 就是用 uptime 的時候,會出現的信息啦! | | /proc/version | 核心的版本,就是用 uname -a 顯示的內容啦! | | /proc/bus/* | 一些總線的設備,還有 USB 的設備也記錄在此喔! | 其實,上面這些文件鳥哥在此建議您可以使用 cat 去查閱看看,不必深入了解, 不過,觀看過文件內容后,畢竟會比較有感覺啦!如果未來您想要自行撰寫某些工具軟件, 那么這個目錄下面的相關文件可能會對您有點幫助的喔! ### 16.4.3\. 查詢已打開文件或已執行程序打開之文件 其實還有一些與程序相關的指令可以值得參考與應用的,我們來談一談: * fuser:借由文件(或文件系統)找出正在使用該文件的程序 有的時候我想要知道我的程序到底在這次啟動過程中打開了多少文件,可以利用 fuser 來觀察啦! 舉例來說,你如果卸載時發現系統通知:“ device is busy ”,那表示這個文件系統正在忙碌中, 表示有某支程序有利用到該文件系統啦!那么你就可以利用 fuser 來追蹤啰!fuser 語法有點像這樣: ``` [root@study ~]# fuser [-umv] [-k [i] [-signal]] file/dir 選項與參數: -u :除了程序的 PID 之外,同時列出該程序的擁有者; -m :后面接的那個文件名會主動的上提到該文件系統的最頂層,對 umount 不成功很有效! -v :可以列出每個文件與程序還有指令的完整相關性! -k :找出使用該文件/目錄的 PID ,并試圖以 SIGKILL 這個訊號給予該 PID; -i :必須與 -k 配合,在刪除 PID 之前會先詢問使用者意愿! -signal:例如 -1 -15 等等,若不加的話,默認是 SIGKILL (-9) 啰! 范例一:找出目前所在目錄的使用 PID/所屬帳號/權限 為何? [root@study ~]# fuser -uv . USER PID ACCESS COMMAND /root: root 13888 ..c.. (root)bash root 31743 ..c.. (root)bash ``` 看到輸出的結果沒?他說“.”下面有兩個 PID 分別為 13888, 31743 的程序,該程序屬于 root 且指令為 bash 。 比較有趣的是那個 ACCESS 的項目,那個項目代表的意義為: * c :此程序在當前的目錄下(非次目錄); * e :可被觸發為執行狀態; * f :是一個被打開的文件; * r :代表頂層目錄 (root directory); * F :該文件被打開了,不過在等待回應中; * m :可能為分享的動態函數庫; 那如果你想要查閱某個文件系統下面有多少程序正在占用該文件系統時,那個 -m 的選項就很有幫助了! 讓我們來做幾個簡單的測試,包括實體的文件系統掛載與 /proc 這個虛擬文件系統的內容, 看看有多少的程序對這些掛載點或其他目錄的使用狀態吧! ``` 范例二:找到所有使用到 /proc 這個文件系統的程序吧! [root@study ~]# fuser -uv /proc /proc: root kernel mount (root)/proc rtkit 768 .rc.. (rtkit)rtkit-daemon # 數據量還不會很多,雖然這個目錄很繁忙~沒關系!我們可以繼續這樣作,看看其他的程序! [root@study ~]# fuser -mvu /proc USER PID ACCESS COMMAND /proc: root kernel mount (root)/proc root 1 f.... (root)systemd root 2 ...e. (root)kthreadd .....(下面省略)..... # 有這幾支程序在進行 /proc 文件系統的存取喔!這樣清楚了嗎? 范例三:找到所有使用到 /home 這個文件系統的程序吧! [root@study ~]# echo $$ 31743 # 先確認一下,自己的 bash PID 號碼吧! [root@study ~]# cd /home [root@study home]# fuser -muv . USER PID ACCESS COMMAND /home: root kernel mount (root)/home dmtsai 31535 ..c.. (dmtsai)bash root 31571 ..c.. (root)passwd root 31737 ..c.. (root)sudo root 31743 ..c.. (root)bash # 果然,自己的 PID 在啊! [root@study home]# cd ~ [root@study ~]# umount /home umount: /home: target is busy. (In some cases useful info about processes that use the device is found by lsof(8) or fuser(1)) # 從 fuser 的結果可以知道,總共有五只 process 在該目錄下運行,那即使 root 離開了 /home, # 當然還是無法 umount 的!那要怎辦?哈哈!可以通過如下方法一個一個刪除~ [root@study ~]# fuser -mki /home /home: 31535c 31571c 31737c # 你會發現, PID 跟上面查到的相同! Kill process 31535 ? (y/N) # 這里會問你要不要刪除!當然不要亂刪除啦!通通取消! ``` 既然可以針對整個文件系統,那么能不能僅針對單一文件啊?當然可以啰!看一下下面的案例先: ``` 范例四:找到 /run 下面屬于 FIFO 類型的文件,并且找出存取該文件的程序 [root@study ~]# find /run -type p .....(前面省略)..... /run/systemd/sessions/165.ref /run/systemd/sessions/1.ref /run/systemd/sessions/c1.ref # 隨便抓個項目!就是這個好了!來測試一下! [root@study ~]# fuser -uv /run/systemd/sessions/c1.ref USER PID ACCESS COMMAND /run/systemd/sessions/c1.ref: root 763 f.... (root)systemd-logind root 5450 F.... (root)gdm-session-wor # 通常系統的 FIFO 文件都會放置到 /run 下面,通過這個方式來追蹤該文件被存取的 process! # 也能夠曉得系統有多忙碌啊!呵呵! ``` 如何?很有趣的一個指令吧!通過這個 fuser 我們可以找出使用該文件、目錄的程序,借以觀察的啦! 他的重點與 ps, pstree 不同。 fuser 可以讓我們了解到某個文件 (或文件系統) 目前正在被哪些程序所利用! * lsof :列出被程序所打開的文件文件名 相對于 fuser 是由文件或者設備去找出使用該文件或設備的程序,反過來說,如何查出某個程序打開或者使用的文件與設備呢?呼呼!那就是使用 lsof 啰~ ``` [root@study ~]# lsof [-aUu] [+d] 選項與參數: -a :多項數據需要“同時成立”才顯示出結果時! -U :僅列出 Unix like 系統的 socket 文件類型; -u :后面接 username,列出該使用者相關程序所打開的文件; +d :后面接目錄,亦即找出某個目錄下面已經被打開的文件! 范例一:列出目前系統上面所有已經被打開的文件與設備: [root@study ~]# lsof COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,0 4096 128 / systemd 1 root rtd DIR 253,0 4096 128 / systemd 1 root txt REG 253,0 1230920 967763 /usr/lib/systemd/systemd ....(下面省略).... # 注意到了嗎?是的,在默認的情況下, lsof 會將目前系統上面已經打開的 # 文件全部列出來~所以,畫面多的嚇人啊!您可以注意到,第一個文件 systemd 執行的 # 地方就在根目錄,而根目錄,嘿嘿!所在的 inode 也有顯示出來喔! 范例二:僅列出關于 root 的所有程序打開的 socket 文件 [root@study ~]# lsof -u root -a -U COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root 3u unix 0xffff8800b7756580 0t0 13715 socket systemd 1 root 7u unix 0xffff8800b7755a40 0t0 1902 @/org/freedesktop/systemd1/notify systemd 1 root 9u unix 0xffff8800b7756d00 0t0 1903 /run/systemd/private .....(中間省略)..... Xorg 4496 root 1u unix 0xffff8800ab107480 0t0 25981 @/tmp/.X11-unix/X0 Xorg 4496 root 3u unix 0xffff8800ab107840 0t0 25982 /tmp/.X11-unix/X0 Xorg 4496 root 16u unix 0xffff8800b7754f00 0t0 25174 @/tmp/.X11-unix/X0 .....(下面省略)..... # 注意到那個 -a 吧!如果你分別輸入 lsof -u root 及 lsof -U ,會有啥信息? # 使用 lsof -u root -U 及 lsof -u root -a -U ,呵呵!都不同啦! # -a 的用途就是在解決同時需要兩個項目都成立時啊! ^_^ 范例三:請列出目前系統上面所有的被啟動的周邊設備 [root@study ~]# lsof +d /dev COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root 0u CHR 1,3 0t0 1028 /dev/null systemd 1 root 1u CHR 1,3 0t0 1028 /dev/null # 看吧!因為設備都在 /dev 里面嘛!所以啰,使用搜尋目錄即可啊! 范例四:秀出屬于 root 的 bash 這支程序所打開的文件 [root@study ~]# lsof -u root &#124; grep bash ksmtuned 781 root txt REG 253,0 960384 33867220 /usr/bin/bash bash 13888 root cwd DIR 253,0 4096 50331777 /root bash 13888 root rtd DIR 253,0 4096 128 / bash 13888 root txt REG 253,0 960384 33867220 /usr/bin/bash bash 13888 root mem REG 253,0 106065056 17331169 /usr/lib/locale/locale-archive ....(下面省略).... ``` 這個指令可以找出您想要知道的某個程序是否有啟用哪些信息?例如上頭提到的范例四的執行結果呢! ^_^ * pidof :找出某支正在執行的程序的 PID ``` [root@study ~]# pidof [-sx] program_name 選項與參數: -s :僅列出一個 PID 而不列出所有的 PID -x :同時列出該 program name 可能的 PPID 那個程序的 PID 范例一:列出目前系統上面 systemd 以及 rsyslogd 這兩個程序的 PID [root@study ~]# pidof systemd rsyslogd 1 742 # 理論上,應該會有兩個 PID 才對。上面的顯示也是出現了兩個 PID 喔。 # 分別是 systemd 及 rsyslogd 這兩支程序的 PID 啦。 ``` 很簡單的用法吧,通過這個 pidof 指令,并且配合 ps aux 與正則表達式,就可以很輕易的找到您所想要的程序內容了呢。 如果要找的是 bash ,那就 pidof bash ,立刻列出一堆 PID 號碼了~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看