sed&awk

Evernote Export

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

mail

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

(0)
N23-蘇州-voidN23-蘇州-void
上一篇 2017-01-05 11:16
下一篇 2017-01-05 16:43

相關推薦

  • Linux系統網絡屬性管理

        每臺計算機主機連入internet都必須給主機設定以個合法的IP地址。這些IP參數大概包括IP地址、子網掩碼、網關、路由、DNS等。在Linux中,大多數命令配置網絡配置都是臨時生效,想要網絡服務永久有效就必須寫入配置文件中,所以有時候更改配置重啟主機是為了讓內核重讀配置文件到內核中,因為配置文件屬于用戶空間的文件。大多數網絡配置…

    Linux干貨 2016-09-18
  • Centos7下的systemd管理

    systemd簡介 Systemd是由紅帽公司的一名叫做Lennart Poettering的員工開發,systemd是Linux系統中最新的初始化系統(init),它主要的設計目的是克服Sys V 固有的缺點,提高系統的啟動速度,systemd和upstart是競爭對手,ubantu上使用的是upstart的啟動方式,centos7上使用systemd替換…

    Linux干貨 2016-09-23
  • N26-第五周

    1、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;  ~]# grep “^[[:space:]]\+$” /boot/grub/grub.conf 2、顯示/etc/rc.d/rc.sysinit文件中以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行; ~]# grep &#82…

    Linux干貨 2017-03-02
  • ? 基于Sentinel實現redis主從自動切換

    Sentinel(哨兵)是用于監控redis集群中Master狀態的工具,它可以實現對redis的監控、通知、自動故障轉移。 Sentinel作用: Master狀態檢測 當被監控的某個 Redis Master異常無法連接時 Sentinel 可以向系統管理員發送通知, 也可以通過 API 向其他程序發送通知,并且進行Master-Slave切換,將其中一…

    Linux干貨 2016-02-14
  • LVS產生背景、原理及LVS-DR應用實例(二)

    六、LVS-DR應用實例          (一)基本構建思路:           Director: 通過Director實現訪問調度到RS1,RS2,實現負載均衡,RS3負責動態分離?!?/p>

    Linux干貨 2016-10-29
  • 磁盤管理

    磁盤設備 一切皆文件 所有的Linux中的設備都可以使用下面命令進行操作:open(), read(), write(), close()(這些是C的函數) 塊設備:隨機訪問 字符設備:線性訪問 設備號碼: 主設備號:major number,標識設備類型 8是主要設備編號,代表類型 次設備號:minor number…

    Linux干貨 2016-09-01

評論列表(1條)

  • 馬哥教育
    馬哥教育 2017-04-13 08:50

    總結的grep,sed,awk比較詳細,好多用法要能靈活用在實際工作中,繼續加油。

欧美性久久久久