原文發表於「網絡安全和信息化」2018年第3期,轉載到博客。shell
進程管理是Linux系統運維人員應掌握的一項基本技能,Linux做爲典型的多用戶操做系統,容許多個用戶同時從不一樣的終端進行登陸,用戶在相應終端上所啓動的進程與各自的終端之間存在緊密的聯繫。本文以CentOS7系統爲例,經過兩個具體的實例介紹瞭如何對Linux系統中的進程和終端進行管理。安全
一般咱們將一套鍵盤鼠標以及顯示器這樣的輸入輸出設備稱爲一個終端,直接鏈接在電腦主機上的稱爲物理終端。在操做安裝有Windows系統的電腦時,一般是隻有一套物理終端而且只有一個操做界面。而Linux系統支持虛擬終端,在操做安裝有Linux系統的計算機時,用戶雖然面對的也是一套物理終端設備,但卻能夠經過虛擬終端打開多個互不干擾、獨立工做的界面。
Linux中提供的虛擬終端默認有6個,其中第1個是圖形界面,第2到6個則是字符界面。能夠經過Ctrl+Alt+F(1~6)組合鍵在不一樣的虛擬終端之間進行切換,好比安裝有X Window的Linux系統啓動以後默認就是進入了第1個虛擬終端中的圖形界面,此時按下組合鍵Ctrl+Alt+F2就進入到了第2個虛擬終端,這就是一個字符界面了。
虛擬終端的縮寫爲tty,在字符界面下執行「tty」命令就能夠顯示用戶當前所在的終端編號。bash
[root@localhost ~]# tty /dev/tty2
因爲咱們一般都是經過網絡遠程對Linux服務器進行管理,這種經過遠程登陸方式所打開的終端稱爲僞終端(pts)。好比咱們經過Xshell遠程登陸到Linux系統,而後一樣執行tty命令,發現顯示的結果爲「/dev/pts/0」,表示這是系統啓動的第一個僞終端(僞終端的編號從0開始)。服務器
[root@localhost ~]# tty /dev/pts/0
另外,若是Linux系統安裝了X Window,那麼在圖形界面中,右鍵單擊桌面空白處而後選擇「在終端中打開」,此時所打開的也是一個pts僞終端。但因爲在生產環境中不多有人會這樣操做,因此這種狀況能夠忽略不計。
於是能夠總結一下,對於Linux系統而言,終端主要分爲兩類:由用戶在本地所打開的終端稱爲虛擬終端tty,由用戶在遠程所打開的終端稱爲僞終端pts。因爲絕大多數狀況下咱們都是遠程對Linux服務器進行管理,於是用戶所使用的終端主要是僞終端pts。每一個終端都有相應的編號,執行tty命令就能夠查看到用戶當前所在的終端編號。網絡
Linux系統中的進程與啓動進程的終端之間是緊密關聯的,好比咱們直接執行不帶任何選項的ps命令,將只顯示當前用戶在當前終端所啓動的進程。運維
[root@localhost ~]# ps PID TTY TIME CMD 5290 pts/0 00:00:00 bash 5309 pts/0 00:00:00 ps
能夠看到,當前用戶只啓動了2個進程,分別是「bash」和「ps」。其中「ps」就是剛纔執行的ps命令所產生的進程,而「bash」則是當前終端所對應的終端進程,它也是ps進程的父進程。
若是但願查看系統中全部的進程,就須要爲ps命令加上相應的選項,好比經常使用的選項組合「aux」,其中的選項「a」就表示顯示與當前終端有關的全部進程,選項「x」表示顯示與當前終端無關的全部進程,於是兩個選項結合起來就表示顯示系統中的全部進程了。
好比分屏查看當前系統中全部進程的詳細信息。ssh
[root@localhost ~]# ps aux | more USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.4 193628 4636 ? Ss 00:14 0:06 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0.0 0.0 0 0 ? S 00:14 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 00:14 0:07 [ksoftirqd/0] ……
在詳細的進程信息中能夠看到,不少進程的TTY字段顯示爲「?」,這表示該進程不是由用戶在某個終端啓動的,而是由系統內核所啓動。
對於那些由用戶執行命令所啓動的進程都是與終端相關的,當把終端關閉,該終端中的全部進程也都會自動關閉。這是Linux系統一個很是重要的特色,下面的兩個實例都是對這個特色的具體應用。ide
進程就是運行中的程序,咱們只要在Shell命令行下輸入並執行某條命令,就會啓動一個相應的進程。Linux系統中的進程有前臺進程和後臺進程之分,一般狀況下咱們執行命令所產生的進程都是前臺進程,前臺進程的一個重要特色是會佔據當前終端,當進程沒有結束的時候,用戶不能在當前終端中再進行其它的操做。
好比咱們執行「nc -l -p 8000」命令偵聽TCP8000端口(CentOS7中默認沒有安裝nc,若是已經配置好yum源,能夠執行「yum install nc」命令安裝),這條命令執行以後將會一直處於運行狀態,若是用戶不按Ctrl+c鍵強制停止,該進程將一直佔據當前終端。
若是在要執行的命令後面加上一個「&」符號,此時進程將轉到後臺運行,其執行結果不在屏幕上顯示,該進程也不會佔據當前終端,用戶仍能夠繼續執行其它的操做。
好比,在後臺執行nc命令偵聽TCP8000端口。操作系統
[root@localhost ~]# nc -l -p 8000 & [1] 79878
固然也能夠直接執行命令啓動一個前臺進程,而後再經過按下Ctrl+z組合鍵,將該進程轉入到後臺。只不過經過這種方式轉入到後臺的進程將處於中止狀態,須要再經過執行bg命令使其在後臺繼續執行。命令行
[root@localhost ~]# nc -l -p 8000 ^Z [1]+ 已中止 nc -l -p 8000 [root@localhost ~]# jobs -l [1]+ 102964 中止 nc -l -p 8000 [root@localhost ~]# bg 1 [1]+ nc -l -p 8000 & [root@localhost ~]# jobs -l [1]+ 102964 運行中 nc -l -p 8000 &
不管是經過在命令後面加「&」符號在後臺執行的進程,仍是經過Ctrl+z組合鍵而轉日後臺的進程,它們都與當前終端相關。若是將當前終端關閉,那麼這些在後臺運行的進程也將所有關閉。這樣若是咱們但願可以經過nc命令在系統中始終監聽TCP8000端口,這就很難實現了。
於是若是但願某些進程可以始終在後臺運行,那麼能夠經過nohup命令解除其與當前終端之間的關係。好比咱們但願不管當前終端是否關閉,始終都在後臺執行nc命令監聽本機的TCP6000端口。那麼能夠執行下面的命令:
[root@localhost ~]# nohup nc -l -p 6000 & [2] 103240 [root@localhost ~]# nohup: 忽略輸入並把輸出追加到"nohup.out"
命令執行以後,將當前終端關閉,而後再次打開一個新的終端,執行「ps aux | grep nc」命令查找nc命令所產生的進程,能夠看到由「nc -l -p 6000」命令產生的進程所對應的終端已經變爲了「?」,即由系統內核啓動,而再也不與任何終端關聯。
[root@localhost ~]# ps aux | grep nc …… root 103240 0.0 0.1 43512 1808 ? S 15:55 0:00 nc -l -p 6000 root 103304 0.0 0.0 112668 968 pts/0 R+ 15:57 0:00 grep --color=auto nc
這樣這條命令所產生的進程就成爲了系統的後臺進程,若是管理員不用kill命令強制終止的話,這個進程將一直運行下去。
下面再經過一個實例進一步說明進程和終端之間的關係。
因爲Linux是一個多用戶的操做系統,做爲管理員就須要隨時瞭解當前正在有哪些用戶在登陸系統。經過執行who命令能夠查看當前正在登陸系統的用戶以及其相關信息。
[root@localhost ~]# who root :0 2017-10-14 15:20 (:0) root pts/0 2017-12-28 15:57 (192.168.80.1) root tty2 2017-12-28 16:11
從who命令的執行結果能夠發現,有3個用戶正在以root用戶的身份登陸系統。其中第一行信息沒有顯示終端,代表root用戶是在本地登陸,因爲是本地登陸,於是未顯示IP地址。第二行信息代表root用戶在遠程的僞終端pts/0上登陸,並顯示了登陸IP。第三行信息代表root用戶在本地的虛擬終端tty2上登陸,一樣不顯示IP地址。
下面咱們在系統中建立一個名爲hacker的帳號,並利用該帳號在某個終端上遠程登陸。
建立帳號並設置密碼:
[root@localhost ~]# useradd hacker [root@localhost ~]# echo "123" | passwd --stdin hacker 更改用戶 hacker 的密碼 。 passwd:全部的身份驗證令牌已經成功更新。
而後在另一臺Kali系統中(IP地址192.168.80.20)利用hacker帳號遠程登陸Linux服務器(IP地址192.168.80.146):root@kali:~# ssh hacker@192.168.80.146
登陸成功以後,在Linux服務器中執行who命令查看當前登陸用戶。能夠發現有一個可疑用戶正在IP地址爲192.168.80.20的客戶端上遠程登陸,其所在終端編號爲pts/1。
[root@localhost ~]# who root :0 2017-10-14 15:20 (:0) hacker pts/1 2017-12-28 16:19 (192.168.80.20) root pts/0 2017-12-28 15:57 (192.168.80.1) root tty2 2017-12-28 16:11
下面咱們將這個可疑用戶踢出系統。
首先須要根據可疑用戶所在終端查找出該終端所對應的進程,能夠執行「ps aux | grep pts/1」命令。從命令的執行結果能夠看到PID爲103707的進程對應的終端爲pts/1,並且該進程是由bash啓動的,這正是咱們所要找的終端進程。
[root@localhost ~]# ps aux | grep pts/1 hacker 103706 0.0 0.2 142916 2224 ? S 16:19 0:00 sshd: hacker@pts/1 hacker 103707 0.0 0.2 116168 2740 pts/1 Ss+ 16:19 0:00 -bash root 103801 0.0 0.0 112664 972 pts/0 S+ 16:25 0:00 grep --color=auto pts/1
而後經過kill命令強制終止該進程。[root@localhost ~]# kill -9 103707
再次執行who命令,發現可疑用戶已經被踢出,並且該用戶啓動的全部進程也將自動關閉(經過nohup命令轉爲系統後臺進程的除外)。
[root@localhost ~]# who root :0 2017-10-14 15:20 (:0) root pts/0 2017-12-28 15:57 (192.168.80.1) root tty2 2017-12-28 16:11