红帽RHCE培训记录(二)
shell 編程
前面三種是在子 shell 中執行,第四種是在當前 shell 執行
$[],中括號里面可以進行運算
位置化參數
$0 腳本名
$1 第1個參數
$* 所有的參數,雙引號引起來時參數視為單個字符串
$@ 所有的參數,雙引號引起來時,每個參數作為一個個體
$# 參數的個數
$$ 當前進程的 PID
$? 上一個命令的返回值,0表示成功
read
從命令行中輸入字符串,賦值給一個變量
read -p "Enter your name:" NAME [student@example Documents]$ read -p "Enter your name:" NAME Enter your name:zhangsan [student@example Documents]$不加變量名,默認賦值給 REPLY 變量。
-t 超時時間(秒)
exit 退出碼
程序執行后會攜帶一個退出碼
0 代表成功,1-255 代表失敗;儲存在系統變量 $? 中;exit num 可以中斷程序并設置退出碼為 num
例如,判斷 /etc/profile 文件里是否有關鍵字 HISTSIZE
[student@example Documents]$ grep HISTSIZE /etc/profile HISTSIZE=1000 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL [student@example Documents]$ echo $? 0條件執行運算符
&& 代表邏輯與,前一個命令執行成功會執行后一個
|| 代表邏輯或,前一個命令執行成功,后面的命令不會再執行
布爾運算符
! 非運算
-o 或運算
-a 與運算
數值運算符
判斷變量是不是數字:
[["$num10" =~ ^[0-9]+$ ]]
ps: shell中各種括號的作用()、(())、[]、[[]]、{}
字符串運算符
= 檢測兩個字符串是否相等。 等于返回 0 [ $a = $b ]
!= 檢測兩個字符串是否相等。等于返回 1 [ $a != $b ]
[ -n “$A” ] 判斷變量是否定義
條件判斷
if 條件表達式 then 指令 fi if 條件表達式;then 指令 fi if 條件表達式;then 指令1 else 指令2 fi if 條件表達式1;then 指令1 elif 件表達式2;then 指令2 else 指令3 ficase語句
case 變量名 in值1)指令1;;值2)指令2;;*)指令4;; esacfor循環
直接列出元素
for i in 1 3 5 do指令 done使用大括號
for i in {1...5} do指令 done使用 seq
for i in $(seq 1 5) do指令 done使用命令的結果
for i in $(ls *.sh) do指令 doneps: shell 編程內容較多,建議找一本相應的書籍學習,本文僅列出了很少一部分。
計劃任務
一次性計劃任務
at 管理一次性計劃任務
at timespec 創建計劃任務,ctrl+d 結束輸入
at timespec < script 從腳本輸入
at -l 列出計劃任務
at -c jobnum 查看計劃任務的詳細信息
at -d jobnum 刪除計劃任務
timespec 舉例
8:.05am
4pm+3days
04:00 2021-08-02
now+5min
teatime tomorrow (下午茶時間)
時間的具體定義在文件 /usr/share/doc/at/timespec
/etc/at.deny 和 /etc/at.allow 文件可以設置其他用戶的計劃任務權限
周期性計劃任務
crontab 命令管理周期性計劃任務
crontab -e 編輯當前用戶的計劃任務
crontab -l 列出當前用戶的計劃任務
crontab -r 刪除當前用戶所有計劃任務
crontab -u 管理其他用戶的計劃任務
例如:
crontab -u admin -l 列出 admin 用戶的計劃任務
* * * * * echo hello 分鐘 小時 日 月 星期 具體的任務 0-59 0-23 1-31 1-12 0-7
簡記:分,時,日,月,周
如果是同一位置的兩個時間點,就以逗號隔開
舉例
0 10 1 * * 任務每月的 1 號 10:00 執行一次
0 10 1 * 6 任務每月的 1 號 10:00 且該天為星期六時執行一次
10,20 * * * * 任務每小時的第 10 分和第 20 分執行一次
*/5 10 * * * 任務每天10點,每隔5分鐘執行一次
* 10-12 * * * 任務每天的 10 到 12 點,每分鐘執行一次(注意,12:00 ~ 12:59在該時間段范圍內)
30-59/2 14 * * * 任務// TODO
每天的 14:30 ~ 15:00,每兩分鐘執行一次 ?????
用戶的計劃任務
cron 任務(使用 crontab 命令創建的任務)保存在 /var/spool/cron 中的文件中,文件的名稱與用戶名相同
用戶設置計劃任務的權限
/etc/cron.deny 僅拒絕
/etc/cron.allow 僅允許
系統的計劃任務
使用 /etc/crontab 文件創建的計劃任務,一般只有系統管理員才能操作該文件
還可以寫在 /etc/cron.d/ 文件夾下的文件里。 /etc/cron.hourly/ 中也有
建議不要使用命令,而是使用該文件創建計劃任務
配置文件 /etc/anacrontab
該服務管理 /etc/cron.daily/、/etc/cron.monthly/、/etc/cron.weekly/ 三個目錄
查找和處理文件
find 查找文件
根據文件名查找
-name 文件名,支持使用 glob(7) * ? [] [^]
-iname 文件名,不區分字母大小寫
-inum n 按 node 號查找
-link n 鏈接數為 n 的文件
例如 find /etc -name '*pass*'
根據文件屬主、屬組查找
find /home -user admin find /home -group root find /home -uid 1001 find /home -nouser # 無屬主的文件 find /home -nogroup # 無屬組的文件根據文件大小查找
-size [+|-] #UNIT
UNIT 表示常用單位:k, M, G,#表示給出的具體數值
#UNIT 對應 (#-1, #)
-#UNIT 對應 [0, #-1]
+#UNIT 對應 (#, ∞\infty∞)
5M 對應 (4M, 5M]
-5M 對應 (0, 4M]
+5M 對應 (5M, ∞\infty∞)
例如 find /tmp -size 5M
根據文件的權限查詢
-perm
MODE 精確匹配
/MODE u, g, o 任何一類對象只要有一位匹配中即可
-MODE 每一類對象都必須同時擁有指定的權限才可匹配
0 表示不關注
根據文件時間戳查找
以“天”為單位
-atime
-mtime
-ctime
以“分鐘”為單位
-amin
-mmin
-cmin
例如 find /tmp -atime +7
在查找到的文件上繼續操作
例如
find /etc/ -name *.conf -exec cp {} /root/data \; 對查找到的每個文件執行拷貝到 /root/data 下的命令
find ! -perm -100 -exec chmod u+x {} \; 對查找到的文件,沒有執行權限的給其加上執行權限
dd 命令
dd: device to device
if: input file
of: output file
bs: block size 塊大小,文件系統 文件最小組成單元
count: 塊的個數
測試底層存儲的速率
對分區備份
恢復
dd if=/boot.bak of=/dev/nvme0n1p1網絡客戶端
curl 命令
curl url (獲取該網址的文本信息)curl -i url (獲取該網址的文本信息以及協議頭部信息)curl -x proxy url 使用代理獲取網頁文本信息curl -o bilibili.html bilibili.com 將網頁內容保存為本地的 bilibili.htmlcurl -O http://www.linux.com/hello.sh 下載文件curl -o dodo1.jpg http://www.linux.com/dodo1.JPG 下載文件并保存為 dodo1.jpgcurl -O -u 用戶名:密碼 ftp://www.linux.com/dodo1.JPGcurl -oO ftp://用戶名:密碼@www.linux.com/dodo1.JPGwget 命令,上傳和下載文件
OpenSSH
OpenSSH 在 RHEL 上使用 SSH 協議,能以加密和安全的方法進行通信。
ssh [user@]hostname 遠程登錄
ssh [user@]hostname command 遠程執行命令
ssh -X [user@]hostname 遠程調用圖形界面
ssh 作為服務端的配置文件 /etc/ssh/sshd_config
公鑰和私鑰
每次輸入密碼比較麻煩,使用秘鑰驗證較為方便和安全。
非對稱加密:
兩把鑰匙,公鑰和私鑰
客戶端生成公鑰和私鑰,把公鑰給服務端
客戶端連接的時候,服務端會使用公鑰加密一段隨機的字符串,然后將字符串發送給客戶端;
客戶端使用私鑰解密加密后的字符串,并將解密后的字符串發送給服務端;
服務端對比發送過來的字符串與加密之前的字符串是否相同,相同即成功。
在客戶端生成公鑰和秘鑰
ssh-keygen會生成私鑰文件 id_rsa 和公鑰文件 id_rsa.pub。客戶端將公鑰發送給服務端(服務端會將其存儲在 ~/.ssh/authoried_keys)
ssh-copy-id -i id_rsa.pub root@192.168.153.139成功后,可以嘗試登陸
ssh root@192.168.153.139此時可以直接連接,不需要再輸入密碼
為了私鑰的安全,在生成私鑰的時候,給私鑰加密。但如果這樣做,連接服務端的時候需要輸入私鑰密碼。鑒于此,需要為 ssh 開啟認證代理。
ssh-agent bash # 開啟認證代理 ssh-add # 將私鑰密碼添加到認證代理scp 遠程傳輸命令
用法:
scp [option] 本地文件 遠程賬戶@遠程IP地址:遠程目錄
scp [option] 遠程賬戶@遠程IP地址:遠程文件 本地文件
-r: 復制目錄
-p: 保留時間和權限
-P: 指定遠程主機的端口號
-C: 壓縮數據
rsync 增量備份工具
rsync [options…] src… [dest]
Pull: 遠程->本地
rsync root@192.168.153.39:/home/student/ /tmp/test/Push: 本地->遠程
rsync /tmp/test/ root@192.168.153.39:/home/student/注意,源路徑如果是一個目錄的話,/home/student 和 /home/student/ 是不一樣的。帶上尾斜線表示的是目錄中的文件,不包括目錄本身;不帶尾斜線表示的是整個目錄包括目錄本身,傳送目錄需要用 -r 參數
增量備份的原理:
mtime 時間戳:文件內容是否修改
option 說明:
-r: 同步目錄
-v: 顯示 rsync 過程中的詳細信息
-n: 進測試傳輸,而不實際傳輸
-t: 保持 mtime 屬性
-o: 保持 owner 屬性
-g: 保持 group 屬性
-p: 保持 perms 屬性(權限,不包括特殊權限)
–delete: 以 SRC 為主,對 DEST 進行同步。多則刪之,少則補之。
高級用戶組和權限
密碼期限
用戶密碼文件 /etc/shadow
root:$6$mpoRoTVDJTTcy9q3$wd3uxrPXXgwqpTUDkAWGAbThCiD/zutRc6ekGpcDf34zLR4Fd/WnyZLQWGOSmudO/ZwVIXsXRYbl0qYWle/yJ0:18818:0:99999:7:::用戶名:加密密碼:最近一次修改密碼的時間:密碼最短使用天數: 密碼最長有效天數:密碼即將到期警告天數:密碼過期后賬戶保持活動天數:賬號失效時間:保留字段
chage 命令調整密碼期限
chage -m 0 -M 90 -W7 -I 14 user3 分別修改用戶密碼的最短期限,最長期限,警告周期,失效期限
chage -d 0 user3 強制要求用戶在下一次登錄時更新密碼
chage -I user3 顯示用戶密碼的信息
chage -E 2020-10-10 user3 用戶將于 2020-10-10 到期
默認權限
目錄的最大權限是 777
文件的最大權限是 666
創建文件或目錄時,默認會有一個權限。這個權限,由用戶的 umask 值來決定(文件或目錄的最大權限減去 umask 值)
設置 umask 值用 umask 命令,例如 umask 033,這種是臨時修改方式;修改 ~/.bashrc 可以永久修改。
普通用戶的 umask 值是 002,因此,創建的文件權限是 664,目錄權限是 775
root用戶的 umask 值是022,因此,創建的文件權限是 644,目錄權限是 755
文件的特殊權限
例如,執行以下命令
[root@example ~]# ll /etc/shadow ----------. 1 root root 1616 Jul 18 13:42 /etc/shadow會發現用戶對該文件沒有任何權限,但是用戶修改密碼的時候,確實是修改了該文件,怎么實現呢?
passwd 這個命令在這里
[root@example ~]# ll /usr/bin/passwd -rwsr-xr-x. 1 root root 34512 Aug 13 2018 /usr/bin/passwd該命令的權限是 4755,多了一個 “s” 的權限,即 suid。chmod u-s /usr/bin/passwd 將該權限減去。
[root@example ~]# ll /usr/bin/passwd -rwsr-xr-x. 1 root root 34512 Aug 13 2018 /usr/bin/passwd [root@example ~]# chmod u-s /usr/bin/passwd [root@example ~]# ll /usr/bin/passwd -rwxr-xr-x. 1 root root 34512 Aug 13 2018 /usr/bin/passwd [root@example ~]# chmod u-x /usr/bin/passwd [root@example ~]# chmod u+s /usr/bin/passwd [root@example ~]# ll /usr/bin/passwd -rwSr-xr-x. 1 root root 34512 Aug 13 2018 /usr/bin/passwd注意,‘S’ 比 ‘s’ 少了 ‘x’ 權限
-
suid: 4 如果一個文件有 suid 的權限,那么任何人執行該文件,將有文件擁有人的權限
設置在文件上,設置在目錄上無意義。
只能作用在二進制程序上(命令就是二進制的可執行程序),不能作用在腳本上。
設置方法:chmod u+s file 或者 chmod 4755 file。 -
sgid: 2 如果一個文件有 sgid 的權限,那么任何人執行該文件,將有文件擁有組的權限
對于目錄而言,如果一個目錄有 sgid 的權限,那么任何人在該目錄下面創建文件和目錄時,自動繼承該目錄的組。
chmod g+s dir -
stciky: 1 如果一個目錄有 sticky 權限,那么只有 root 用戶和文件的擁有人能夠刪除該目錄下的文件
設置在目錄上,設置在文件上無意義
對于一個多人可寫的目錄,如果設置了 sticky ,則每個用戶僅能刪除和修改自己的文件或目錄
設置方法 chmod o+t dir 或者 chmod 1777 dir
ACL(Access Control List) 權限:訪問控制列表
設置和刪除
如果一個目錄的權限是
drwxr-xr-x. 2 root root 6 Aug 7 18:37 data如果我想使 admin 用戶對該目錄有 rwx 權限,在不修改該目錄權限和擁有人擁有組的情況下,可以通過下面的命令設置
setfacl -m u:admin:rwx data/此時,該目錄的權限變成了
drwxrwxr-x+ 2 root root 6 Aug 7 18:37 data/注意這個’+'即表示該目錄有設置過 acl 權限,但是這樣以來,這么看它的權限是不準確的。使用
[student@example tmp]$ getfacl data/ # file: data/ # owner: root # group: root user::rwx # 擁有人的權限 user:student:rwx # 單獨給用戶 student 設置的權限 group::r-x # 擁有組的權限 mask::rwx # mask 值表示該目錄的最大權限 other::r- # 其他人的權限刪除 ACL 權限:
setfacl -x u:student data/ setfacl -x g:it data/ setfacl -b data/ # 清空所有的 acl 權限 setfacl -R data/ # 遞歸修改 acl 權限優先級
如果以文件擁有者的身份訪問,那么文件所有者的權限適用
如果訪問用戶身份設置了 acl 權限,那么該用戶的 acl 權限適用(只要掩碼允許)
如果以文件擁有組的身份訪問,或者訪問用戶的組設置了 acl 權限,那么則匹配相應的 acl 權限(只要掩碼允許)
否則,將適用文件的其他人的權限
設置默認 ACL 權限
目的是為了確保用戶在目錄中創建的文件繼承和目錄相同的 acl 權限,setfacl -m d:u:student:rx dir
給指定組設置默認 ACL 權限:setfacl -m d:g:it:rwx dir
刪除指定用戶的默認 acl 權限:setfacl -x d:u:student dir
刪除指定組的默認 acl 權限:setfacl -x d:g:it dir
刪除所有的默認權限:setfacl -k dir
舉例:
[root@example tmp]# setfacl -m d:u:student:rwx data/ [root@example tmp]# getfacl data/ # file: data/ # owner: root # group: root user::r-x group::r-x other::r-x default:user::r-x default:user:student:rwx default:group::r-x default:mask::rwx default:other::r-xsudo 命令
sudo 是 linux 下常用的允許普通用戶使用超級用戶權限的工具,可以減少 root 用戶的登錄和管理實踐,同時也提高了安全性。
sudo 的配置文件時 /etc/sudoers 和 /etc/sudoers.d/*,編輯時最好用 visudo 命令,會幫助檢測語法
user MACHINE=(RunAs) NOPASSWD:COMMANDS
用戶名 被管理主機=(可使用的身份) 授權命令(絕對路徑)
例如:
用戶 哪些權限 root ALL=(ALL) ALL student ALL=(root) /usr/sbin/useraddstudent 可以以 root 身份運行 useradd 命令
root 也可以使用 sudo命令,sudo 默認是以 root 的身份執行命令,但是 -u 選項可以選擇用戶
[root@example tmp]# sudo -u student mkdir data [root@example tmp]# ll -d data drwxr-xr-x. 2 student student 6 Aug 7 21:09 data設置 admin 組可以以 root 身份執行
%admin ALL=(root) /usr/sbin/useradd,/usr/bin/mkdir
總結
以上是生活随笔為你收集整理的红帽RHCE培训记录(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Push mail同步outlook文件
- 下一篇: 启动navicat 报错:navcat