1、總結sed和awk的詳細用法;
awk
Linux文本處理工具三劍客:grep、sed和awk。其中grep是一種文本過濾工具,sed是文本編輯器,而awk是一種報表生成器,就是對文件進行格式化處理的,這里的格式化不是文件系統的格式化,而是對文件內容進行各種“排版”,進而格式化顯示。
在Linux之上我們使用的是GNU awk簡稱gawk,并且gawk其實就是awk的鏈接文件,因此在系統上使用awk和gawk是一樣的。我們通過man gawk可以獲得gawk的相關功能說明—gawk-paten scanning and processing language(模式掃描及處理語言),gawk是一種過程式編程語言,gawk還支持條件判斷、數組、循環等各種編程語言中所有可以使用的功能,因此還可以把gawk稱為一種腳本語言編輯器。
awk的運行方式有3種:
(1)awk命令行
#awk
(2)awk程序文件
#awk -f /path/from/awk_script
(3)awk腳本
#!/bin/awk -f
awk的基本用法:awk [OPTIONS] ‘program’ FILE1 FILE2 …
其中program:PATTERN{ACTION STATEMENT}
program:編程語言
PATTERN:模式
ACTION STATEMENT:動作語句,可以是由多個語句組成,各語句間使用分號隔開;如print,printf。
OPTIONS:
-F[]:指明輸入字段分隔符;
-v VAR_NAME=VALUE:變量賦值;
-f /PATH/FROM/AWK_SCRIPT;
awk在處理文本時也是一次讀取一行文本,然后根據輸入分隔符(默認為空格字符)進行切片,切成n個片段,然后將每一片都賦予awk內部的一個變量當中進行保存,這些變量名為$1、$2、$3等一直到最后一個,awk就可以對這些片段單獨處理,比如顯示某一段、特定段、甚至可以對某些片段進行額外的加工處理,比如計數、運算等。
1、awk的輸出命令之一:print
用法:print item1,items,…
item:字符串,用引號引用;
print “hello”,”world"
變量:顯示變量的值,可以直接使用變量的名進行引用;
print name
數值:無需加引號
要點:
(1)各item之間需要使用逗號分隔;而輸出時的分隔符默認為空白字符;
(2)輸出的各item可以為字符串或數值、當前記錄的字段($#)、變量或awk的表達式;數值會被隱式轉換為字符串進行輸出;
(3)print后面的item省略時,相當于運行“print $0”,用于輸出整行;
(4)輸出空白字符:print“ ”
2、變量
變量分為內建變量和自定義變量
2.1 內置變量
FS:input Field Seperator,輸入字段分隔符,默認為空白;
如:-v FS=“[,;.]”也可以使用-F:
~]# head -3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
~]# awk -v FS=":" '{print $1,$2}' /etc/passwd | head -3
root x
bin x
daemon x
RS:input Record Seperator,輸入時的行分隔符,默認為換行符;
OFS:output Field Separator,輸出時的字段分隔符,默認為空白字符;
~]# awk -v FS=":" -v OFS="," '{print $1,$2}' /etc/passwd | head -3
root,x
bin,x
daemon,x
ORS:Output Record Separator,輸出時的字段分隔符,默認為換行符;
NF:number of field in current record,當前行的字段數;
print NF:顯示當前行的字段數
print $NF:顯示當前行的第NF字段的值
~]# cat /etc/fstab | head -4
#
# /etc/fstab
# Created by anaconda on Sun Sep 11 12:00:46 2016
~]# awk '{print NF}' /etc/fstab | head -4
0
1
2
10
~]# awk '{print $NF}' /etc/fstab | head -4
#
/etc/fstab
2016
NR:number of record,行數:命令后跟的所有文件將統一合并計數;
~]# awk '{print NR}' /etc/fstab | head -4
1
2
3
4
FNR:行數,各文件單獨統計:
FILENALE:當前正被awk讀取的文件的文件名;
ARGC:awk命令運行中的參數個數;
ARGV:數字,保存了命令行參數本身;
ARGV[index]
ARGV[0],ARGV[1]
2.2自定義變量
(1)-v VAR_NAME=VALUE 變量名區分字符大小寫;
~]# cat /etc/issue
\S
Kernel \r on an \m
~]# awk -v Final='Void' '{print Final}' /etc/issue
Void
Void
Void
雖然這里的對象文件/etc/issue內容沒什么用,但是這里使用的文件行數,有多少行就顯示多少個變量值。
(2)在program中自定義變量
~]# awk 'BEGIN{FS=":";f1=3}{print $f1}' /etc/passwd
3、awk的輸出命令之二:printf 格式化輸出
語法:printf FORMAT,item1,item2,…
要點:
(1)必須提供FORMAT;
(2)與print語句不同,printf不會自動換行,需要顯示指定換行符:\n
(3)FORMAT中需要分別為后面的每個item指定一個格式符,否則item無法顯示;
格式符:都以%開頭,后跟單個字符;
%c:顯示字符的ASCII碼;
%d,%i:顯示為十進制整數;
%e,%E:科學計數法顯示數值;
%f:顯示為浮點數;
%g,%G:以科學計數法或浮點數格式顯示數值;
%s:顯示為字符串;
%u:顯示無符號整數;
%%:顯示%符號本身;
~]# cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
~]# awk -F: '{printf "USER:%s\n",$1}' /etc/issue
USER:CentOS release 6.5 (Final)
USER:Kernel \r on an \m
USER:
~]# awk '{printf "USER:%s\n",$1}' /etc/issue
USER:CentOS
USER:Kernel
USER:
USER:%s\n表示對$1的內容以字符串的形式顯示,并且在其前面加上USER:字符串,同時在結尾添加換行符。
~]# awk -F' ' '{printf "USER:%s,UID:%d\n",$1,$3}' /etc/issue
USER:CentOS,UID:6
USER:Kernel,UID:0
USER:,UID:0
USER:%s,UID:%d\n表示對后面的$1的內容以字符串的形式顯示,對后面的$2的內容以十進制的形式顯示,同時在結尾添加換行符。
修飾符:每一種格式符都有一些修飾符
#[.#]:
左邊的#:用于指定顯示寬度;
右邊的#:顯示精度;
+:顯示數值的符號
-:左對齊
~]# awk -F' ' '{printf "USER:%-15s,UID:%15d\n",$1,$3}' /etc/issue
USER:CentOS ,UID: 6
USER:Kernel ,UID: 0
USER: ,UID: 0
左邊一欄以左對齊方式顯示15個字符的長度,右邊欄以默認對齊方式右對齊顯示15個字符的長度。
4、awk的操作符
awk的操作符有:算數運算符、字符操作符、賦值操作符、比較運算符、模式匹配操作符、邏輯操作符、條件表達式和函數調用。
算數操作符:實現一些算數運算,如x+y,x-y,x*y,x/y,x^y,x%y
-x:負值
+x:轉換為數值
字符操作符:字符串鏈接
賦值操作符:通常為變量的賦值,賦值操作符有以下幾種
=,+=,-=,*=,/=,%=,^=
++,–
比較運算符:字符串或者數值的大小比較
>,>=,<,<=,!=,==
模式匹配符:根據右側的模式進行匹配操作
~:是否能由右側指定的模式所匹配
~?。菏欠癫荒苡捎覀戎付J剿ヅ?/p>
邏輯操作符:
&&
||
!
條件表達式:
selector?if-true-expression:if-false-expression
~]# awk -F: '{$3>=500?usertype="Common User":usertype="Sysadmin or SysUse
r";printf "%15s:%-s\n",$1,usertype}' /etc/passwd
root:Sysadmin or SysUser
bin:Sysadmin or SysUser
daemon:Sysadmin or SysUser
adm:Sysadmin or SysUser
lp:Sysadmin or SysUser
sync:Sysadmin or SysUser
shutdown:Sysadmin or SysUser
函數調用:調用函數來進行數據的處理
格式:function_name(argu1,argu2,…)
5、PATTERN模式:對哪些內容進行處理
(1)empty:空模式,匹配每一行;
(2)/regular expression/:僅將ACTION應用于能夠被regular expression所匹配到的行;
~]# awk -F: '/^[ab]/{print $1,$3}' /etc/passwd
bin 1
adm 3
avahi-autoipd 170
abrt 173
apache 48
bash 500
basher 502
(3)relational expression:關系表達式,即結果為“真”、“假”的表達式,或者其結果能類同于“真”或“假”的表達式;一般來說,其結果為非0數值或非空字符串即可類同于“真”,否則,則類同為“假”;
~]# awk -F: '$3>=500{print $1,$3}' /etc/passwd
nfsnobody 65534
bash 500
testbash 501
basher 502
nologin 503
~]# awk -F: '$1~/root/{print $1,$3}' /etc/passwd
root 0
(4)line ranges:行范圍,類似sed或vim中的地址定界方式如:
startline,endline: /pat1/,/pat2/
注意:不支持直接給出數字的格式
~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
bin
daemon
adm
lp
sync
shutdown
halt
uucp
(5)BEGIN/END:兩個特殊模式
BEGIN{}:在文件格式化操作開始之前事先執行的一次操作;通常用于輸出表頭或做出一個預處理操作;
END{}:在文件格式操作完成之后,命令退出之前執行的一次操作;通常用于輸出表尾或做出清理操作;
6、常用ACTION
(1)EXPRESSIONS:例如變量賦值
(2)Control Statements:控制語句,如if,while等;
(3)Compound statements:組合語句;
(4)input statements
(5)output statements
7、控制語句
if(condition) {statments}
if(condition) {statments} else {statements}
while(conditon) {statments}
do {statements} while(condition)
for(expr1;expr2;expr3) {statements}
break
continue
delete array[index]
delete array
exit
{ statements }
7.1 if-else
語法:if(condition) statement [else statement]
~]# awk -F: '{if($3>=500) {printf "Common user:%s\n",$1} else {printf "root or Sysuser:%s\n",$1}}' /etc/passwd
root or Sysuser:root
…
Common user:nologin
…
~]# awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
root
bash
testbash
basher
~]# df -h | awk -F[%] '/^\/dev/{print $1}' | awk '{if($NF>=20) print $1}'
使用場景:對awk取得的整行或某個字段做添加判斷
7.2 while循環
語法:while(condition) statement
條件為“真”時循環,為“假”時退出循環;
使用場景:通常用于在當前行的各字段進行循環;
~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub2.cfg
~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg
~]# awk '{i=1;while(i<=NF){if(length($i)>=6){print $i};i++}}' /etc/issue
CentOS
release
(Final)
Kernel
7.3 do-while循環
語法:do {statement} while (condition)
意義:至少執行一次循環
7.4 for循環
語法:for(expr1;expr2;expr3) statement
for(variable assignment;condition;iteration process) {for-body}
~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
~]# awk '{for(i=1;i<=NF;i++){if(length($i)>=6) print $i}}' /etc/issue
Kernel
特殊用法:
能夠遍歷數組中的元素;
語法:for(var in array) {for-body}
7.5 switch
語法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; …; default: statement}
7.6 break and continue
break[n]:退出當前循環,n是一個數字,用于指定退出幾層循環;
continue:提前結束本輪循環而進入下一輪;
7.7 next:提前結束對本行文本的處理,而提前進入下一行的處理操作:
~]# awk -F: '{if($3%2==0) next;print $1,$3}' /etc/passwd
bin 1
adm 3
sync 5
halt 7
operator 11
nobody 99
systemd-bus-proxy 999
8、數組
關聯數組:array[index-expression]
index-expression:
(1) 可使用任意字符串;字符串要使用雙引號;
(2) 如果某數組元素事先不存在,在引用時,awk會自動創建此元素,并將其值初始化為“空串”;
若要判斷數組中是否存在某元素,要使用"index in array"格式進行;
weekdays[mon]="Monday"
若要遍歷數組中的每個元素,要使用for循環;
for(var in array) {for-body}
~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'
注意:var會遍歷array的每個索引;
state["LISTEN"]++
state["ESTABLISHED"]++
統計當前系統上所有的tcp連接的各種狀態個數:
~]# netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}'
~]# ss -tan | awk '!/^State/{state[$1]++}END{for(i in state) {print i,state[i]}}'
統計指定的web訪問日志中各ip的資源訪問次數:
~]# awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
練習1:統計/etc/fstab文件中每個文件系統類型出現的次數;
~]# awk '/^UUID/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab
練習2:統計指定文件中每個單詞出現的次數;
~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
9、函數
9.1 內置函數
數值處理:
rand():返回0和1之間一個隨機數;
字符串處理:
length([s]):返回指定字符串的長度;
sub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其第一次出現替換為s所表示的內容;
gsub(r,s,[t]):以r表示的模式來查找t所表示的字符中的匹配的內容,并將其所有出現均替換為s所表示的內容;
split(s,a[,r]):以r為分隔符切割字符s,并將切割后的結果保存至a所表示的數組中;
~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
9.2 自定義函數
《sed和awk》
sed
文本處理三劍客:
grep, egrep, fgrep:文本過濾器
sed:Stream EDitor,流編輯器,行
awk:文本格式化工具,報告生成器
sed [OPTION]… 'script' [input-file] …
script:
地址定界編輯命令
常用選項:
-n:不輸出模式空間中的內容至屏幕;
-e script, –expression=script:多點編輯;
-f /PATH/TO/SED_SCRIPT_FILE
每行一個編輯命令;
-r, –regexp-extended:支持使用擴展正則表達式;
-i[SUFFIX], –in-place[=SUFFIX]:直接編輯原文件 ;
~]# sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab
地址定界:
(1) 空地址:對全文進行處理;
(2) 單地址:
#:指定行;
/pattern/:被此模式所匹配到的每一行;
(3) 地址范圍
#,#:
#,+#:
#,/pat1/
/pat1/,/pat2/
$:最后一行;
(4) 步進:~
1~2:所有奇數行
2~2:所有偶數行
編輯命令:
d:刪除;
p:顯示模式空間中的內容;
a \text:在行后面追加文本“text”,支持使用\n實現多行追加;
i \text:在行前面插入文本“text”,支持使用\n實現多行插入;
c \text:把匹配到的行替換為此處指定的文本“text”;
w /PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定的文件中;
r /PATH/FROM/SOMEFILE:讀取指定文件的內容至當前文件被模式匹配到的行后面;文件合并;
=:為模式匹配到的行打印行號;
!:條件取反;
地址定界!編輯命令;
s///:查找替換,其分隔符可自行指定,常用的有s@@@, s###等;
替換標記:
g:全局替換;
w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;
p:顯示替換成功的行;
練習1:刪除/boot/grub/grub2.cfg文件中所有以空白字符開頭的行的行首的所有空白字符;
~]# sed 's@^[[:space:]]\+@@' /etc/grub2.cfg
練習2:刪除/etc/fstab文件中所有以#開頭的行的行首的#號及#后面的所有空白字符;
~]# sed 's@^#[[:space:]]*@@' /etc/fstab
練習3:輸出一個絕對路徑給sed命令,取出其目錄,其行為類似于dirname;
~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
~]# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'
高級編輯命令:
h:把模式空間中的內容覆蓋至保持空間中;
H:把模式空間中的內容追加至保持空間中;
g:把保持空間中的內容覆蓋至模式空間中;
G:把保持空間中的內容追加至模式空間中;
x:把模式空間中的內容與保持空間中的內容互換;
n:覆蓋讀取匹配到的行的下一行至模式空間中;
N:追加讀取匹配到的行的下一行至模式空間中;
d:刪除模式空間中的行;
D:刪除多行模式空間中的所有行;
示例:
sed -n 'n;p' FILE:顯示偶數行;
sed '1!G;h;$!d' FILE:逆序顯示文件的內容;
sed ’$!d' FILE:取出最后一行;
sed '$!N;$!D' FILE:取出文件后兩行;
sed '/^$/d;G' FILE:刪除原有的所有空白行,而后為所有的非空白行后添加一個空白行;
sed 'n;d' FILE:顯示奇數行;
sed 'G' FILE:在原有的每行后方添加一個空白行;
2、刪除/boot/grub/grub.conf文件中所有行的行首的空白字符;
~]# sed 's@^[[:space:]]\+@@' /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root
# initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 rd_LVM_LV=VolGroup/lv_root KEYBOAR
DTYPE=pc KEYTABLE=us rd_NO_DM rhgb quietinitrd /initramfs-2.6.32-431.el6.x86_64.im
3、刪除/etc/fstab文件中所有以#開頭,后跟至少一個空白字符的行的行首的#和空白字符;
~]# sed 's@^#[[:space:]]\+@@' /etc/fstab
#
/etc/fstab
Created by anaconda on Tue Dec 20 11:22:23 2016
#
Accessible filesystems, by reference, are maintained under '/dev/disk'
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
UUID=123bda7a-e4e5-4dc7-9d81-9bd5bcadd76f /boot ext4 defaults
1 2/dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
4、把/etc/fstab文件的奇數行另存為/tmp/fstab.3;
~]# sed 'n;d' /etc/fstab > /tmp/fstab.3
~]# cat /tmp/fstab.3
# /etc/fstab
#
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
/dev/mapper/VolGroup-lv_root / ext4 defaults 1 1
/dev/mapper/VolGroup-lv_swap swap swap defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
proc /proc proc defaults 0 0
5、echo一個文件路徑給sed命令,取出其基名;進一步地,取出其路徑名;
~]# echo "/etc/fstab" | sed 's@^/.*/@@'
fstab
~]# echo "/etc/fstab" | sed -r 's@[^/]+/?$@@'
/etc/
6、統計指定文件中所有行中每個單詞出現的次數;
~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
7、統計當前系統上所有tcp連接的各種狀態的個數;
~]# netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}'
~]# ss -tan | awk '!/^State/{state[$1]++}END{for(i in state) {print i,state[i]}}'
8、統計指定的web訪問日志中各ip的資源訪問次數:
~]# awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
9、寫一個腳本:定義一個數組,數組元素為/var/log目錄下所有以.log結尾的文件的名字;顯示每個文件的行數;
#!/bin/bash
#
filelist=(/var/log/*.log)
for i in $(seq 0 $[${#filelist[@]}-1]);do ${#filelist[@]}表示數組中元素的個數
wc -l ${filelist[i]}
done
執行結果:
~]# bash countlog.sh
158 /var/log/boot.log
4 /var/log/wpa_supplicant.log
0 /var/log/yum.log
10、寫一個腳本,能從所有同學中隨機挑選一個同學回答問題;進一步地:可接受一個參數,做為要挑選的同學的個數;
#!/bin/bash
#
stu=(s1 s2 s3 s4 s5 s6)
num=${#stu[@]}
i=$[$RANDOM % $num]
echo "${stu[i]}"
執行結果
~]# bash stu.sh
s1
~]# bash stu.sh
s6
~]# bash stu.sh
s1
~]# bash stu.sh
s5
~]# bash stu.sh
s5
stu2.sh
#!/bin/bash
#
stu=(s1 s2 s3 s4 s5 s6)
stunumber=${#stu[*]}
read -p "please input the number of students to answer the question:[1-$stunumber]" num
if [[ $num -gt $stunumber || $num -eq 0 ]];then
echo "the number range is 1 – $stunumber"
exit 1
fi
for ((i=0;i<num;i++));do
j=$[$RANDOM % $stunumber]
echo ${stu[$j]}
unset stu[$j]
done
執行結果:
~]# bash stu2.sh
please input the number of students to answer the question:[1-6]0
the number range is 1 – 6
~]# bash stu2.sh
please input the number of students to answer the question:[1-6]11
the number range is 1 – 6
~]# bash stu2.sh
please input the number of students to answer the question:[1-6]3
s5
s4
s2
11、授權centos用戶可以運行fdisk命令完成磁盤管理,以及使用mkfs或mke2fs實現文件系統管理;
/etc/sudoers的通用格式為:
user host=(run_as) [NOPASSWD:] command
user host run_as command
user:一位或幾位用戶,在/etc/group中可以用一個%代替它,組對象的名稱一定要用百分號%開頭。
host:一個或幾個主機名;
run_as:作為哪個用戶運行,常見選項是root和ALL
command:想讓用戶或組運行的一個或幾個根級別命令。
Cmnd_Alias CMND_LVS:可以將命令集合為一個變量,之后直接引用。用戶,主機都可以如此定義。
centos ALL=(root) NOPASSWD: /sbin/fdisk, /sbin/mke2fs, /sbin/mkfs
12、授權gentoo用戶可以運行邏輯卷管理的相關命令;
Cmnd_Alias CMND_LVS = /sbin/lvm, /sbin/lvmchange, /sbin/lvmconf, /sbin/lvmdiskscan, /sbin/lvmdump, /sbin/lvmetad, /sbin/lvmsadc, /sbin/lvmsar
gentoo ALL=(root) NOPASSWD: CMND_LVS
13、基于pam_time.so模塊,限制用戶通過sshd服務遠程登錄只能在工作時間進行;
(1)在account required pam_nologin.so上添加一行:
~]# vim /etc/pam.d/sshd
account required pam_time.so
(2)編輯pam_time.so模塊的配置文件
~]# vim /etc/security/time.conf
*;*;*;MoTuWeThFr0900-1800
14、基于pam_listfile.so模塊,定義僅某些用戶,或某些組內的用戶可登錄系統;
創建一個用戶的列表文件,例如/etc/sshd_userlist,而后編輯文件 root centos gentoo 而后修正文件的權限和屬主
# chmod 600 /etc/sshd_userlist
# chown root /etc/sshd_userlist
再編輯/etc/pam.d/sshd文件:
auth required pam_listfile.so item=user sense=allow file=/etc/sshd_userlist onerr=succeed
原創文章,作者:N23-蘇州-void,如若轉載,請注明出處:http://www.www58058.com/65936
總結的grep,sed,awk比較詳細,好多用法要能靈活用在實際工作中,繼續加油。