概述
放假回家,對Linux系統的一些知識進行重新的整理,做到溫故而知新,對用戶權限管理、文件賦權、壓縮文件、進程與服務的知識進行了一次梳理和總結。
權限管理
Linux最基礎的權限是用戶和文件,先了解基礎的用戶權限和文件權限。
用戶權限
在大多數的Linux發行版中,我們都建議初學者創建一個有限權利的賬戶,我的stark這個用戶就是有限權限的賬戶。
有些命令對系統的穩定性和安全性造成威脅,具有有限的權限意味著我們不能運行一些可怕的命令,在Linux中,理論上來說,我們可以創建無數個用戶,但是這些用戶是被劃分到不同的群組里面。
在安裝完linux系統后,加入我們創建的個人用戶叫做stark,這時系統中默認只有兩個用戶root和stark,我們只在必要的時候才會切換為root身份,其他時候,都是在用有限權限的用戶在運行,這個策略的保護大大地提高了Linux系統的安全性,有效防止誤操作或者是病毒的攻擊。
1、sudo 暫時成為root,終端會提示你輸入密碼,這個密碼是你個人用戶的密碼,即為stark的賬戶密碼。
[stark@localhost ~]$ sudo systemctl status nginx.service
[sudo] stark 的密碼:
2、sudo su
切換到root身份,使用exit
命令退出root,回到stark賬號上。
3、su
,這個命令需要輸入的是root的密碼,這個是需要重點記憶的。
用戶操作
1、添加賬戶名為 work 的用戶,并設置密碼
[root@localhost ~]# useradd work
[root@localhost ~]# passwd work
更改用戶 work 的密碼 。
新的密碼:
重新輸入新的密碼:
passwd:所有的身份驗證令牌已經成功更新。
2、刪除用戶
使用userdel刪除用戶,如果想刪除home目錄,使用-r命令
userdel work # 刪除用戶
userdel -r work # 刪除用戶和家目錄
群組操作
1、創建名為work的群組
groupadd work
2、對群組添加用戶
假如要將stark這個用戶放到我剛創建的work
這個群組里。
usermod -g work stark
可以將一個用戶添加到多個群組,用-G參數,把用戶stark同時添加到work、stark的群組中,備注:群組名之間要用逗號分隔,而且沒有空格!
usermod -G work,stark stark
- -i:對用戶重命名
/home
中的用戶家目錄名不改變,需要手動修改 - -g:修改用戶所在群組
需要注意的是,使用usermod
時要小心,因為配合-g
或-G
參數時,它會把用戶從原先的群組里剔除,加入到新的群組。
如果你不想離開原先去群組,又想加入新的群組,可以在-G
的參數基礎上加上-a
參數。
usermod -aG work,stark stark
3、刪除群組
刪除名為work的群組
groupdel work
4、用groups命令可以獲知一個用戶屬于哪個群組
[root@localhost home]# groups stark
stark : work
文件權限
1、文件權限
修改文件的所有者和群組,這里有個chown
萬能的命令,-R
參數非常有用,R是recursive的縮寫,表示遞歸,用來設置子目錄和子文件。
chown -R stark:stark file.txt
2、文件訪問權限
在Linux系統里,每個文件和目錄都有一系列的權限屬性,使用chmod
命令修改文件的訪問權限,chmod
命令不需要是root用戶才能運行,只要你是此文件的所有者,就可以用chmod
來修改文件的訪問權限。
chmod
的絕對用法來分配權限,使用數字賦予文件訪問權限chmod 640 file.txt
,對所有者、所屬組、其他用戶,只要分別做加法就可以了,然后把三個和連起來。
權限 | 數字 | 說明 |
---|---|---|
r | 4 | 讀 |
w | 2 | 寫 |
x | 1 | 執行 |
chmod
的相對用法是使用字面來賦予權限,+表示添加權限,-表示去除權限,=表示分配權限。
[stark@localhost ~]$ chmod u=rwx,g=r,o=- test.sh
[stark@localhost ~]$ ll | grep test.sh
-rwxr----- 1 stark work 35 1月 5 16:34 test.sh
權限 | 說明 |
---|---|
u | 所有者 |
g | 群組 |
o | 其他 |
防火墻
Linux防火墻是一個用于管理系統內部網絡訪問的組件,旨在防止未經授權的訪問和惡意攻擊,Centos7以后 iptables 更換為 firewalld。
1、查看防火墻狀態命令
systemctl status firewalldfirewall-cmd --state
● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled)Active: active (running) since Sun 2025-01-05 21:19:47 CST; 19min agoDocs: man:firewalld(1)Process: 268803 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)Main PID: 267866 (firewalld)Tasks: 3 (limit: 22689)Memory: 37.6MCPU: 833msCGroup: /system.slice/firewalld.service└─267866 /usr/bin/python3 -s /usr/sbin/firewalld --nofork --nopid
2、設置開放和移除端口
防火墻上添加和移除端口操作,以80端口為例,添加/移除操作后,需要重啟防火墻服務。
#添加80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
#移除80端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent#重啟防火墻
firewall-cmd --reload
systemctl reload firewalld.service
3、查看已經開放的端口
sudo firewall-cmd --list-ports
80/tcp 3306/tcp
重定向
重定向輸出
Linux重定向的作用是把本來要顯示在終端的命令結果,輸送到別的地方,到文件中或者作為其他命令的輸入。
>
最簡單的操作就是把操作的命令的輸出結果重定向到文件中,使用這個符號要小心,如果此文件不存在,則新建一個文件,如果此文件已經存在,那就會把文件內容覆蓋掉,而且是不會征求用戶確認的。
>>
是將重定向的內容寫入到文件末尾,起到追加的作用,如果文件不存在,也會被創建。
有時候我們既不想把輸出結果顯示在終端上,也不想輸出在文件中,Linux中有一個俗稱黑洞文件 /dev/null
重定向錯誤輸出
先介紹三種輸出stdin
,stdout
,stderr
:
1、從鍵盤向終端輸入數據,這是標準輸入,也就是stdin,對應的文件描述符是0。
2、終端接收鍵盤輸入的命令,會產生兩種輸出,即標準輸出stdout,對應的文件描述符是1,一種是標準錯誤輸出,即stderr,對應的文件描述符是2。
2>&1
將標準錯誤輸出重定向與標準輸出相同的地方。
定時任務
Linux中的定時任務由crontab
命令來執行,用來讀取和修改名為crontab
的文件,crontab
文件包含了你要定時執行的程序列表,也包含了執行的時刻。
crontab
用于修改crontab文件,cron用于實際執行定時的程序。
crontab
的三個主要參數:
- -l:顯示crontab文件
- -e:修改crontab文件
- -r:刪除crontab文件
命令格式:
minute hour dom month dow command
1、分鐘,取值范圍 (0-59)
2、小時,取值范圍 (0-23)
3、日,取值范圍 (1-31)
4、月份,取值范圍 (1-31)
5、星期幾,取值范圍 (0-6,星期日是0)
6、要執行的命令
例句:
Crontab | 意義 |
---|---|
47 * * * * command | 每個小時的47分都執行 command 命令 |
0 0 * * 1 command | 每個星期1的凌晨都執行 command 命令 |
30 5 1-15 * * command | 每個月的1-15日的5點30分都執行command命令 |
0 0 * * 1,3,4 command | 每個月星期一、星期三、星期四的凌晨都執行command命令 |
0 */2 * * * command | 每2個小時的整點(0,2,4,6 等等)都執行command命令 |
*/10 * * * 1-5 command | 每個星期一到星期五的每個10的倍數的分鐘 |
壓縮和解壓
操作壓縮和解壓時,先了解兩個概念,將多個文件變成一個總文件,叫打包,將一個大文件通過某些壓縮算法變成一個小文件,叫壓縮。
1、創建一個歸檔
把tartest文件夾中的文件,壓縮成名為tartest.tar壓縮包的命令如下。
- c: create 表示創建
- v: verbose 表示顯示操作的細節
- f: file 指定歸檔文件
[stark@localhost ~]$ sudo tar -cvf tartest.tar tartest/
[sudo] stark 的密碼:
tartest/
tartest/erros.log
tartest/file.txt
tartest/nohup.out
2、顯示歸檔里的內容
-tf
顯示歸檔里的內容,并不解開歸檔。
[stark@localhost ~]$ tar -tf tartest.tar
tartest/
tartest/erros.log
tartest/file.txt
tartest/nohup.out
3、追加文件到歸檔
把 result.txt 追加到文檔到 tartest.tar 歸檔中
[stark@localhost ~]$ tar -rvf tartest.tar result.txt
result.txt
4、解壓歸檔文件
tar -xvf tartest.tar
進程和服務
進程
簡單來說,進程就是加載到內存中運行的程序,大多數程序運行時都只在內存中啟動一個進程,有的軟件在程序運行時卻會創建不少進程,比如 Apache、Mysql等等。
1、列出所有參數的所有進程
ps -ef
2、列出指定用戶運行的進程
ps -u www
3、通過Cpu和內存過濾進程
ps aux | less
默認的結果集是未排好序的,可以通過 --sort
參數來排序,根據CPU使用率降序排列:ps -aux --sort -pcpu
,根據內存使用率來降序排列:ps -aux --sort -pmem
將CPU和內存參數合并到一起,并通過管道顯示前10個結果ps -aux --sort -pcpn,+pmem | head
4、以樹形結構顯示進程
pstree 命令有很豐富的參數,更多使用man pstree
查看文檔
[stark@localhost ~]$ pstree -p | grep mysql|-mysqld_safe(164526)---mysqld(165067)-+-{mysqld}(165068)| |-{mysqld}(165069)| |-{mysqld}(165070)
5、關閉進程
5.1、Ctrl+C
停止終端中正在運行的進程
Ctrl+C
這個組合鍵只能作用于當前終端中正在運行的程序,而終端中的復制和粘帖需要用Ctrl+Shift+C
和Ctrl+Shift+V
來執行。
5.2、kill命令
可以同時用kill來結束好幾個進程,只要用空格隔開他們的PID,可以用kill -9
來立即強制結束進程。
sudo kill 254653 254656 254655
5.3、killall
killall命令同一個程序運行時可能啟動多個進程,不同于kill命令,killall命令后接程序名。
服務
在Linux中有特殊的進程,這些進程不與任何終端關聯,并且無論用戶的身份如何,都在后臺運行,這些進程的父進程是PID進程號為1的進程,PID為1的進程只在系統關閉時才會被銷毀。
這些進程會在后臺一直運行,并且等待我們給他們分配工作,在Unix/Liunx的世界中,我們將這類進程稱之為守護進程,守護進程也被稱為service,服務器軟件大多數都是以守護進程形式運行的,守護進行的名字通常會在最后有一個d,例如systemd,httpd,smbd
等等。
Linux操作系統的開機過程:BIOS啟動->
BootLoader啟動->
加載系統內核->
內核進行初始化->
啟動初始化進程->
初始化工作。
Systemd
Systemd 是 Linux 系統工具,用來啟動守護進程,已成為大多數發行版的標準配置。歷史上,Linux 的啟動一直采用init進程,Systemd使用并行代替了init的串行。Systemd 并不是一個命令,而是一組命令,涉及到系統管理的方方面面。
1、Systemd管理系統
# 重啟系統
$ sudo systemctl reboot# 關閉系統,切斷電源
$ sudo systemctl poweroff# CPU停止工作
$ sudo systemctl halt# 暫停系統
$ sudo systemctl suspend# 讓系統進入冬眠狀態
$ sudo systemctl hibernate# 讓系統進入交互式休眠狀態
$ sudo systemctl hybrid-sleep# 啟動進入救援狀態(單用戶狀態)
$ sudo systemctl rescue
systemctl list-units
命令可以查看當前系統的所有 Unit 。
# 列出正在運行的 Unit
$ systemctl list-units# 列出所有Unit,包括沒有找到配置文件的或者啟動失敗的
$ systemctl list-units --all# 列出所有沒有運行的 Unit
$ systemctl list-units --all --state=inactive# 列出所有加載失敗的 Unit
$ systemctl list-units --failed# 列出所有正在運行的、類型為 service 的 Unit
$ systemctl list-units --type=service
2、Unit 的狀態
systemctl status命令用于查看系統狀態和單個 Unit 的狀態。
# 顯示系統狀態
$ systemctl status# 顯示單個 Unit 的狀態
$ sysystemctl status bluetooth.service# 顯示遠程主機的某個 Unit 的狀態
$ systemctl -H stark@172.16.163.141 status httpd.service
除了status命令,systemctl還提供了三個查詢狀態的簡單方法,主要供腳本內部的判斷語句使用,以mysql服務為例。
# 顯示某個 Unit 是否正在運行
$ systemctl is-active mysql.service# 顯示某個 Unit 是否處于啟動失敗狀態
$ systemctl is-failed mysql.service# 顯示某個 Unit 服務是否建立了啟動鏈接
$ systemctl is-enabled mysql.service
3、Unit 管理
對于用戶來說,最常用的是下面這些命令,用于啟動和停止 Unit(主要是 service)。
# 立即啟動一個服務
$ sudo systemctl start apache.service# 立即停止一個服務
$ sudo systemctl stop apache.service# 重啟一個服務
$ sudo systemctl restart apache.service# 殺死一個服務的所有子進程
$ sudo systemctl kill apache.service# 重新加載一個服務的配置文件
$ sudo systemctl reload apache.service# 重載所有修改過的配置文件
$ sudo systemctl daemon-reload# 顯示某個 Unit 的所有底層參數
$ systemctl show httpd.service# 顯示某個 Unit 的指定屬性的值
$ systemctl show -p CPUShares httpd.service# 設置某個 Unit 的指定屬性
$ sudo systemctl set-property httpd.service CPUShares=500
4、開機啟動
# 開機自動啟動服務
sudo systemctl enable httpd# 開機不自動啟動服務
sudo systemctl disable httpd# 查看服務是否開機自動啟動
sudo systemctl is-enable httpd# 查看各個級別下服務的啟動和禁止情況
systemctl list-unit-files --type=service
問題
1、sudo 命令,暫時成為root,需要注意的是有可能會提示 stark 不在 sudoers 文件中。此事將被報告。
,切換root身份,編輯/etc/sudoers
文件,配置權限,步驟如下。
su -
vim /etc/sudoers
stark ALL=(ALL) ALL