linux經常使用命令【原創】

 

 

查看文件內容-while:php

cat 1.txt|while read line;do echo $line;donehtml

while read line; do echo $line; done <./1.txtjava

從日誌當中測試鏈接統計狀況mysql

while :; do tail -n 100 /app/nginx/web.log |cut -d -f 8|sort|uniq -c;sleep 5;donelinux

統計文件代碼行數:ios

find . -type f -name "*.sh" | xargs wc -lnginx

 

統計sh文件中含有lst字符串並降序排列web

find . -type f -iname "*.sh"| xargs grep -c lst | grep -v ":0$" | sort -t : -k 2 -nr面試

 

找到當前文件夾下非jpg和JPG文件內容中的ab替換爲cdsql

find . -type f -print |grep -v ".*\.\(jpg\|JPG\)" | xargs sed -i "s/ab/cd/g"

if/else:

exist=1;ip=192.168.0.1;port=3306;if [ ${exist} -eq 1 ]; then echo ${ip}:${port};fi

for:

for ip in 192.168.1.{1..255} ;do ping ${ip} -w 1 &> /dev/null && echo ${ip} is Alive;done

for ip in `cat iplist`;do scp config/${ip}.conf $ip:/home/shell/;done

for x in `cat 1.txt`; do echo $x;mkdir dir{0..2}{0..2}_$x; done

for i in `cat iplistr.ip`; do echo $i; ssh $i "supervisorctl start nginx";done

mysql相關:

socket=`ps -ef|grep mysql|grep -v grep|grep sock|awk 'BEGIN{FS = "--"}{for (f=1; f <= NF; f+=1) {if ($f ~ /sock/) {print $f}}}'|awk -F'=' '{print $2}'|grep 3306`;echo $socket

while :; do sleep 1;netstat -lanp|grep 3306|grep ESTABLISHED|awk '{print $5}'|awk -F ':' '{print $1}'|sort|uniq|wc -l|awk 'BEGIN{a="'$(date +%H:%M:%S)'";}{printf "%s,%d\n",a,$1}' >> access_num.log;done

查看系統資源

取進程佔用 cpu 最高的前10個進程
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head

取進程佔用內存(MEM)最高的前10個進程
ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head

查找系統佔用磁盤最大的前十個文件

du -sk /*|sort -rn|head

排名前5的文件大小

find . -type f -exec ls -l -h {} \; | sort -nr -k 5 | head -n 5

統計超過1年的zip壓縮文件的總和

find ./ -name "*.zip" -mtime +365|xargs du -ch

查看CPU及硬盤大小

# 查看CPU型號

grep 'model name' /proc/cpuinfo  | head -1 | awk -F":" '{print $2}'

# 查看物理CPU個數

grep 'physical id' /proc/cpuinfo | sort -u | wc -l

# 查看邏輯CPU的個數

grep 'processor' /proc/cpuinfo | sort -u | wc -l

# 查看磁盤大小

fdisk -l | grep 'Disk /dev/xvd' | awk '{print $3}' | awk '{sum+=$1} END {print sum}'

 

解釋

SUM += $1

sum默認初值爲0。awk逐行處理,$1爲每行的第一個字段,就是計算每行第一個字段的累加和。

END部分是處理完全部行後執行的。

print SUM  即打印最終的累加和

1.CPU

 

# 查看物理CPU個數

cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l

 

# 查看每一個物理CPU中core的個數(即核數)

cat /proc/cpuinfo| grep "cpu cores"| uniq

 

# 查看邏輯CPU的個數

cat /proc/cpuinfo| grep "processor"| wc -l

 

# 查看CPU信息(型號)

cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c

 

 

# 總核數 = 物理CPU個數 X 每顆物理CPU的核數

# 總邏輯CPU數 = 物理CPU個數 X 每顆物理CPU的核數 X 超線程數

二、disk

查看磁盤大小

fdisk -l | grep 'Disk /dev/xvd' | awk '{print $3}' | awk '{sum+=$1} END {print sum}'

三、free -m

centos7查看內存

[root@localhost proc]# free -m
total        used        free      shared  buff/cache   available
Mem:            977         360          97           7         520         411
Swap:          2047           0        2047

空閒內存total-used=free+buff/cache
咱們經過free命令查看機器空閒內存時,會發現free的值很小。這主要是由於,在linux中有這麼一種思想,內存不用白不用,所以它儘量的cache和buffer一些數據,以方便下次使用。但實際上這些內存也是能夠馬上拿來使用的。

 

查看系統信息

 

date;uname -ar;

more /etc/redhat-release;

top -n 1|grep -E 'Tasks|Mem|Swap';

df -kh;

free -m;

netstat -nltp;

cat /proc/net/sockstat;

cat /proc/cpuinfo|grep 'physical id'|sort -n|uniq -c;

cat /proc/cpuinfo|grep -E 'vendor_id|model name|cpu MHz|cache size'|sort -n|uniq -c;

getconf LONG_BIT;

/sbin/ifconfig|grep HWaddr|awk '{print $0,$4,$5}';

/sbin/ifconfig|grep inet|grep -v inet6|grep -v 127.0.0.1;

dmidecode |grep Product

 

date;uname -ar;more /etc/redhat-release;top -n 1|grep -E 'Tasks|Mem|Swap';df -kh;free -m;netstat -nltp;cat /proc/net/sockstat;cat /proc/cpuinfo|grep 'physical id'|sort -n|uniq -c;cat /proc/cpuinfo|grep -E 'vendor_id|model name|cpu MHz|cache size'|sort -n|uniq -c;getconf LONG_BIT;/sbin/ifconfig|grep HWaddr|awk '{print $0,$4,$5}';/sbin/ifconfig|grep inet|grep -v inet6|grep -v 127.0.0.1;dmidecode |grep Product

iostat查看IO

iostat 3 3

 

iostat -d -x -k 1 10

Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util

sda          1.56  28.31  7.84 31.50   43.65    3.16    21.82     1.58     1.19     0.03    0.80   2.61  10.29

sda          1.98  24.75 419.80  6.93 13465.35  253.47  6732.67   126.73    32.15     2.00    4.70   2.00  85.25

sda          3.06  41.84 444.90 54.08 14204.08 2048.98  7102.04  1024.49    32.57     2.10    4.21   1.85  92.24

能夠看到磁盤的平均響應時間<5ms,磁盤使用率>80。磁盤響應正常,可是已經很繁忙了。

 

iostat

iostat -d -k 1 10 #查看TPS和吞吐量信息

iostat -d -x -k 1 10 #查看設備使用率(%util)、響應時間(await)應該低於5ms,若是大於10ms就比較大了。

iostat -c 1 10 #查看cpu狀態

 

Linux iostat監測IO狀態 - 翼動動空 的我的空間 - 開源中國社區

http://my.oschina.net/u/2294938/blog/673925

sed

替換

sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config

 

文件5-10行的前面加#號

sed -i "5,10s/^/#/" host_slow.log

 

查找 00:10:34至00:10:38的日誌內容

cat server.out.20160114 |sed -n '/2016-01-13 00:10:34/,/2016-01-13 00:10:38/p'

 

查看指定時間的日誌

sed -n '/2016-01-13 00:10:34/,/2016-01-13 00:10:38/p'  server.out.20160114

 

sed用法,把空格和tab開頭的去除掉

sed 's/^[ t]*//g' 等於 sed 's/^[ \t]*//g

例子:grep 'cpu cores' /proc/cpuinfo |uniq |awk -F : '{print $2}' |sed 's/^[ \t]*//g'

 

find

刪除或移動文件

find . -type f -name *.log | xargs rm

find . -type f -name "*.sh" | xargs -i mv {} /home/shell

 

xargs與find常常結合來進行文件操做,平時刪日誌的時候只是習慣的去刪除,好比

 # find . -type f -name "*.log" | xargs rm -rf *                        

就將以log結尾的文件刪除了,若是我想去移動或者複製就須要使用參數來代替了。

 

find . -type f -name "*.txt" | xargs -i cp {}  /tmp/k/

 

請不要用此方法移動文件夾,會直接刪除文件夾

ls -ld phpframe-* -exec mv {} /backup \;

ls -ld phpframe-*|xargs mv /backup/

 

 

用xargs查詢,注意要有|,另此命令是分批處理以前查詢的結果

find . -perm 777|xargs ls -l

 

若是系統磁盤忽然沒空間了,查找最近五天內更過的文件

find / -mtime -5

 

查看更改時間在5天前的文件

find / -mtime +5

 

根據文件內容來查找相關文件所在位置

find ./ -type f| xargs grep -i 'dataSource'

 

根據文件修改時間、名字複製到制定目錄

find ./ -mtime +120 -name "mysql-bin*"|xargs -n1 -i cp -a {} /home/mysqlbinlog-bak/mysql3306-binlog/

 

根據文件名後綴,刪除文件。例如刪除phd的文件

-rw-r--r--. 1 root root 662M Jun 14 10:29 heapdump.20160614.102831.29419.0004.phd

-rw-r--r--. 1 root root 662M Jun 14 10:29 heapdump.20160614.102831.29419.0006.phd

-rw-r--r--. 1 root root 662M Jun 14 10:29 heapdump.20160614.102831.29419.0007.phd

-rw-r--r--. 1 root root 662M Jun 14 10:30 heapdump.20160614.102831.29419.0008.phd

 

find ./ -iregex ".*\.phd"|xargs rm -rf

 

grep

查詢並輸出成功或失敗

grep 'SELINUX=enforcing' /etc/selinux/config 2>&1 >/dev/null  &&  print_PASS || print_FAIL

 

截取TYPE列的信息

blkid /dev/sda1 | awk -F"=" '{print $2}'|awk '{print $2}'

 

blkid /dev/sda1 | awk -F"=" '{print $2}'|awk '{print $1}'|cut -d"\"" -f2

bb0954a8-3507-4613-b4ee-5c5961c43a36

 

判斷磁盤大小

lsblk | grep sda1 | grep -qs '2.1G' && print_PASS || print_FAIL

 

變量賦值爲一個命令運行的結果

mode=`ls -lh /root/foo.sh  | awk '{print $1}'`

查詢防火牆服務是否加入防火牆

firewall-cmd --list-all | grep   services | grep  -qsE ssh && print_PASS || print_FAIL

 

firewall-cmd --list-all | grep -qsE "rule family=\"ipv4\" source address=\"172.17.10.0/24\" service name=\"ssh\" reject" && print_PASS || print_FAIL

 

判斷服務是否起來

systemctl status httpd &>/dev/null && echo PASS || echo FAIL

 

查進程並殺掉

ps -ef|grep "/opt/openoffice4/program/soffice"|grep -v grep|grep -v grep|awk '{print $2}'  | xargs kill

awk

查找document的selinux標籤

         documentroot=`grep "DocumentRoot" /etc/httpd/conf.d/vhost-server0.conf | awk '{print $2}' | awk -F\" '{print $2}'`

         context=`ls -lZd $documentroot | awk -F: '{print $3}'

 

查看文件權限

ls -lh /root/foo.sh  | awk '{print $1}'

 

顯示以字母t開頭的全部用戶信息

awk '/^t/{print $1}' /etc/passwd

 

顯示UID大於500的用戶信息

awk -F: '$3>=500{print $1,$3}' /etc/passwd

 

BEGIN/END

BEGIN/END,BEGIN在第一行被讀取前執行,END表示在最後一行匹配完再執行

示例1:統計每種shell使用的用戶的個數

# awk -F: '{shell[$NF]++}END{for(A in shell){print A,shell[A]}}' /etc/passwd

/bin/sync 1

/bin/bash 10

/sbin/nologin 34

 

 

示例2:統計每一個TCP鏈接狀態的個數

# netstat -ant | awk '/^tcp/{STATE[$NF]++}END{for (s in STATE) print s,STATE[s]}'

LISTEN 15

ESTABLISHED 1

 

示例3:統計日誌文件中每一個IP地址的訪問量

awk '{counts[$1]++} END{for(ip in counts) print counts[ip],ip}' /var/log/httpd/access_log

 

cd /usr/local/nginx/logs

 

awk '{counts[$1]++} END{for(ip in counts) print counts[ip],ip}' access.log |sort -rn|head -n 30

 

cat access.log|sort|awk '$NF!~/-/ {print $1"," $NF}'|uniq |awk -F  , '{print $1}'|uniq -c|sort -nr|head -20

 

awk能夠截取多個字段

dir -l|awk '{print $3,$4,$9}'

 

awk的NR用法

打印第二行第二項

[root@hchtest2 ~]#  free -m | awk 'NR==2 {print $2}'

1878

You have new mail in /var/spool/mail/root

[root@hchtest2 ~]#  free -m

             total       used       free     shared    buffers     cached

Mem:          1878       1804         73          0         73        293

-/+ buffers/cache:       1437        441

Swap:         1635         49       1586

 

打印第二行

cat /etc/issue.net | awk 'NR==1 {print}'

CentOS release 6.5 (Final)

[root@hchtest2 ~]# cat /etc/issue.net

CentOS release 6.5 (Final)

Kernel \r on an \m

 

查看內存信息

dmidecode|grep -P -A5 "Memory\s+Device"|grep Size

egrep

用egrep查找3項內容memory_limit、post_max_size、upload_max_filesize

cat php.ini|egrep "memory_limit|post_max_size|upload_max_filesize"

memory_limit = 512M

post_max_size = 100M

upload_max_filesize = 100M

查找java進程

ps -ef|grep java|egrep -o "[1-9]{4}"|head -n1

date

設置變量爲3天前

[root@hchtest3 ~]# date +%F

2015-11-30

[root@hchtest3 ~]# date +%F -d "-3 days"

2015-11-27

[root@hchtest3 ~]# date +%Y-%m-%d -d "-3 days"

2015-11-27

 

時間輸入

date '+%F %r'

2016-12-12 09:32:07 AM

 

setfacl

設置目錄/javasoft下的全部文件及文件夾都對ljun有讀寫權限

setfacl -R -m u:ljun:rwx /javasoft/

 

不加 -R遞歸,就只在 /javasoft裏有權限, /javasoft/123裏就沒有權限了

setfacl -m u:ljun:rwx /javasoft/

 

現有一目錄是虛擬機和linux共享的,可是每次程序調用新建的文件都發現沒有權限。

因而指定特定目錄及其子目錄下新建的文件或目錄對於用戶qhfz都有讀寫執行的權限

-R表示遞歸 -m表示設置文件acl規則

setfacl -R -m d:u:qhfz:rwx /data2/ResourceCase

setfacl -R -m d:u: ResourceCase:rwx /data2/ResourceCase

--刪除ACL規則使用-b

setfacl -R -b /data2/ResourceCase

nmap

nmap查找網絡中全部活躍的主機

$ nmap -sn 10.42.0.0/24

  • -sn- 是掃描的類型,這裏是 ping 方式掃描。默認上,Nmap 使用端口掃描,可是這種掃描會禁用端口掃描。
  • 10.42.0.0/24- 是目標網絡,用你實際的網絡來替換

 

mount

掛載cifs

mount -t cifs -o username=andy,password=redhat //172.24.6.10/common /haha

 

cat

eof結束

利用cat輸入腳本,eof結束輸入

if [ ! -f LNMP+zabbix.repo ]; then

cat> /etc/yum.repos.d/LNMP+zabbix.repo <<'EOF'

[nginx]

name=nginx repo

baseurl=http://nginx.org/packages/centos/6/$basearch/

gpgcheck=0

enabled=1

EOF

fi

 

 

設置變量爲一個查詢結果命令,並取出結果的某一列

#!/bin/bash

RESULT=$(cd /opt/mqm/bin

su mqm << remotessh

./runmqsc HUFFPMQ

dis qlocal(USKY.HUFFP.RESPONSE4) CURDEPTH;

end

exit

remotessh

)

VARA=$(echo $RESULT |grep -o "CURDEPTH([0-9]\+)"|grep -o "[0-9]\+")

#VARA=$(echo $RESULT | awk "/CURDEPTH\(([0-9]*)/" |grep -o "[0-9]\+")

echo $VARA

 

 

# cat << EOF > /tmp/3.txt

> aaaa

> bbbb

> cccc

> dddd

> EOF

 

 

建立500M的主分區

# echo -e "n\np\n1\n\n+500M\nw\n" | fdisk /dev/sdb &> /dev/null 

 

\n:自動換行

 

-n, --number 對輸出的全部行編號

-b --number-nonblank 對非空輸出行編號

-T, --show-tabs 將跳 字符顯示爲 ^I

[root@localhost ~]# cat -b /etc/fstab   注:查看/etc/目錄下的profile內容,而且對非空白行進行編號,行號從1開始;
[root@localhost ~]# cat -n /etc/profile    注:對/etc目錄中的profile的全部的行(包括空白行)進行編號輸出顯示;

 

 ps

查看殭屍進程

ps -A -o stat,ppid,pid,cmd |grep -e "^[Zz]"

 

批量刪除殭屍進程

ps -A -o stat,ppid,pid,cmd |grep -e "^[Zz]"|awk '{print $2}'|xargs kill -9

 

ps aux | less 

         vsz:進程所佔用內存的總大小 以kb爲單位

         rss:進程所佔用實際物理內存的大小 以kb爲單位

 

lsof

查看端口是哪一個進程佔用

[root@hchtest3 nginx]# lsof -i:80

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

haproxy 2200 nobody    4u  IPv4  11716      0t0  TCP hchtest3:http (LISTEN)

top

load average: 0.01, 0.03, 0.05  

         cpu在1分鐘、5分鐘、15分鐘的平均負載值

         平均負載值/cpu個數                          

                   大於1:cpu資源飽和

                   小於1:cpu使用正常

         查看cpu個數:

         # grep "model name" /proc/cpuinfo

         model name     : Intel(R) Core(TM) i5-2450M CPU @ 2.50GHz

 

         # grep "model name" /proc/cpuinfo  | wc -l

         1

 

top命令進程排序顯示

         M:按內存佔用百分比

         P:按CPU佔用百分比

         T:按進程運行時間

 

set顯示環境變量

sar

查看CPU狀況

sar 5 5

sar(System Activity Reporter系統活動狀況報告)是目前 Linux 上最爲全面的系統性能分析工具之一,能夠從多方面對系統的活動進行報告,包括:文件的讀寫狀況、系統調用的使用狀況、磁盤I/O、CPU效率、內存使用情況、進程活動及IPC有關的活動等。

 

輸出項說明:

 

CPU:all 表示統計信息爲全部 CPU 的平均值。

 

%user:顯示在用戶級別(application)運行使用 CPU 總時間的百分比。

 

%nice:顯示在用戶級別,用於nice操做,所佔用 CPU 總時間的百分比。

 

%system:在覈心級別(kernel)運行所使用 CPU 總時間的百分比。

 

%iowait:顯示用於等待I/O操做佔用 CPU 總時間的百分比。

 

%steal:管理程序(hypervisor)爲另外一個虛擬進程提供服務而等待虛擬 CPU 的百分比。

 

%idle:顯示 CPU 空閒時間佔用 CPU 總時間的百分比。

 

1. 若 %iowait 的值太高,表示硬盤存在I/O瓶頸

 

2. 若 %idle 的值高但系統響應慢時,有多是 CPU 等待分配內存,此時應加大內存容量

 

3. 若 %idle 的值持續低於1,則系統的 CPU 處理能力相對較低,代表系統中最須要解決的資源是 CPU 。

 

要判斷系統瓶頸問題,有時需幾個 sar 命令選項結合起來

 

懷疑CPU存在瓶頸,可用 sar -u 和 sar -q 等來查看

 

懷疑內存存在瓶頸,可用 sar -B、sar -r 和 sar -W 等來查看

 

懷疑I/O存在瓶頸,可用 sar -b、sar -u 和 sar -d 等來查看

 

linux sar 命令詳解 - Cai's - 開源中國社區

http://my.oschina.net/caiyuan/blog/119012

 

 

CPU使用狀況

sar -u -o 60 5

 

在全部的顯示中,咱們應主要注意%wio和%idle,%wio的值太高,表示硬盤存在I/O瓶頸,%idle值高,表示CPU較空閒,若是%idle值高但系統響應慢時,有多是CPU等待分配內存, 此時應加大內存容量。%idle值若是持續低於10,那麼系統的CPU處理能力相對較低,代表系統中最須要解決的資源是CPU。

 

磁盤使用狀況

sar -d 5 3

 

懷疑CPU存在瓶頸,可用sar -u 和sar -q來看,懷疑I/O存在瓶頸,可用sar -b、sar -u和sar-d來看

 

sar詳解(linux/unix通用) | 旺旺知識庫

http://www.toxingwang.com/linux-unix/2027.html

 

SAR 命令詳解-dbconf-ChinaUnix博客

http://blog.chinaunix.net/uid-23177306-id-2531032.html

 

sar命令--Linux 性能分析 - richard_2010 - ITeye技術網站

http://richard-2010.iteye.com/blog/1271044

uniq

uniq -c刪除重複值

netstat -an|grep 8080 |grep FIN_WAIT2| grep -E '::ffff:'| awk -F: '{print $8}'|sort -n|uniq -c

 

尋找會員號,並把重複次數倒序排列出來

cat server.out.20160216 |grep "HUBTM LOGIN"|grep member_id|awk -F',' '{print $2}'|awk -F'=' '{print $2}'|sort | uniq -c | sort -k1,1nr | head -10

sort

指令各部分的功能:

sort:  對單詞進行排序

uniq -c:  顯示惟一的行,並在每行行首加上本行在文件中出現的次數

sort -k1,1nr:  按照第一個字段,數值排序,且爲逆序

head -10:  取前10行數據

 

iptables防火牆策略

 

service iptables save

//將規則保存在/etc/sysconfig/iptables文件裏

 

查看防火牆策略

iptables -L -n --line-number

iptables -vnL

service iptables status

 

查看防火牆nat策略

iptables -L -t nat

 

刪除INPUT的第24條策略

iptables -D INPUT 24

 

-I插入策略放到最上面(加入防火牆策略使用這個)

iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 8097 -j ACCEPT

 

-A增長一條規則到最後

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 8097 -j ACCEPT

-D刪除策略

iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 8017 -j ACCEPT

 

ifconfig

臨時綁定IP

ifconfig eth0:0 10.72.32.185 netmask 255.255.255.0

 

eth0綁定網卡

/sbin/ip addr add "10.70.72.126/24" dev eth0

 

刪除臨時IP

/sbin/ip addr del "10.70.72.126/24" dev eth0

 

netstat

Linux 經常使用netstat命令 實例講解

 

這是一個十分經常使用的命令,可讓你實時瞭解到雲主機當前的狀態,例如:常見的80鏈接數量,以及按一些排序,來檢查是否被攻擊?查看time_wait和syn鏈接數量等等。

 

1.查看全部80端口的鏈接數

 

netstat -nat|grep -i "80"|wc -l

 

2.對鏈接的IP按鏈接數量進行排序

 

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

 

3.查看TCP鏈接狀態

 

netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn

 

netstat -n | awk '/^tcp/ {++S[$NF]};END {for(a in S) print a, S[a]}'

 

netstat -n | awk '/^tcp/ {++state[$NF]}; END {for(key in state) print key,"\t",state[key]}'

 

netstat -n | awk '/^tcp/ {++arr[$NF]};END {for(k in arr) print k,"\t",arr[k]}'

 

netstat -n |awk '/^tcp/ {print $NF}'|sort|uniq -c|sort -rn

 

netstat -ant | awk '{print $NF}' | grep -v '[a-z]' | sort | uniq -c

 

4.查看80端口鏈接數最多的20個IP

 

netstat -anlp|grep 80|grep tcp|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -n20

 

netstat -ant |awk '/:80/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A,i}' |sort -rn|head -n20

 

5.用tcpdump嗅探80端口的訪問看看誰最高

 

tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr |head -20

 

6.查找較多time_wait鏈接

 

netstat -n|grep TIME_WAIT|awk '{print $5}'|sort|uniq -c|sort -rn|head -n20

 

7.找查較多的SYN鏈接

 

netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

tar

不解壓查看壓縮文件內容

tar tvf apache-tomcat-8.0.36.tar.gz

gzip、gunzip

Linux壓縮保留源文件的方法:

gzip –c filename > filename.gz

Linux解壓縮保留源文件的方法:

gunzip –c filename.gz > filename

 

設置環境變量

echo "export JAVA_HOME=/usr/local/jdk1.7.0_15" >>~/.bashrc

. ~/.bashrc

echo $JAVA_HOME

 

-a 和 &&的區別

注意-a 和 &&的區別,-a用[]裏,&&均可以

[root@hchtest3 ~]# if [[ -f /root/while.sh || -f /root/pid.sh ]];then echo exist;fi

exist

[root@hchtest3 ~]# if [[ -f /root/while.sh -a -f /root/pid.sh ]];then echo exist;fi

-bash: syntax error in conditional expression

-bash: syntax error near `-a'

[root@hchtest3 ~]# if [ -f /root/while.sh -a -f /root/pid.sh ];then echo exist;fi

exist

 

ls

ls -F -R /etc/

層級顯示目錄下文件、及文件夾

 

ansible經常使用命令

ansible -i hosts all -m ping -f 20 --output=result

-m 指明要使用的模塊名,這裏使用ping模塊來測試ansible是否可達列表中額主機
-f 指明線程數,默認5個併發。
--output 指明輸出文件,不指定的話輸出到控制檯。
 
在遠程主機執行腳本
ansible -i hosts all -m script -a 'mha_stop.sh'
 
#在遠程主機執行shell命令(與command模塊的區別是支持管道和重定向)
ansible -i hosts all -m shell -a " cat /tmp/authorized_keys >> /root/.ssh/authorized_keys"
 
#往遠程主機拷貝文件
ansible -i hosts all -m copy -a "src=/etc/hosts dest=/tmp/hosts mode=600 owner=mdehaan group=mdehaan"
 
#從遠程主機拉取文件
ansible -i hosts all -m fetch -a  "src=/etc/hosts dest=/tmp/hosts mode=600 owner=mdehaan group=mdehaan"
 
#更改遠程文件屬性
ansible -i hosts all -m file -a "dest=/srv/foo/a.txt mode=600"
ansible -i hosts all -m file -a "dest=/srv/foo/b.txt mode=600 owner=mdehaan group=mdehaan"
ansible -i hosts all -m file -a "dest=/path/to/c mode=755 owner=mdehaan group=mdehaan state=directory"
ansible -i hosts all -m file -a "dest=/path/to/c state=absent"
 
#在遠程助主機安裝/刪除/更新包
ansible -i hosts all -m yum -a "name=java-1.8.0-openjdk.x86_64 state=present"
ansible -i hosts all -m yum -a "name=java-1.8.0-openjdk.x86_64 state=absent"
ansible -i hosts all -m yum -a "name=java-1.8.0-openjdk.x86_64 state=latest"
 
#在遠程主機啓/停服務
ansible -i hosts all -f 50 -m service -a "name=filebeat state=started"
ansible -i hosts all -f 50 -m service -a "name=filebeat state=restarted"
ansible -i hosts all -f 50 -m service -a "name=filebeat state=stopped"
 
#在遠程主機部署/刪除cron任務
ansible -i hosts all -m cron -a 'name="a job for reboot" special_time=reboot job="/some/job.sh"'
ansible -i hosts all -m cron -a 'backup="True" name="test" minute="0" hour="2" job="ls -alh > /dev/null"'
ansible -i hosts all -m cron -a 'name="test" state=absent'
 

linux open file修改

vi /etc/security/limits.conf
* soft  nofile  65536
* hard nofile 65536

從新登錄便可,但可能對如今已啓動服務不生效

ulimit -a查看一下

Linux內核參數調整

因爲默認的linux內核參數考慮的是最通用場景,這明顯不符合用於支持高併發訪問的Web服務器的定義,因此須要修改Linux內核參數,讓Nginx能夠擁有更高的性能;

在優化內核時,能夠作的事情不少,不過,咱們一般會根據業務特色來進行調整,當Nginx做爲靜態web內容服務器、反向代理或者提供壓縮服務器的服務器時,期內核參數的調整都是不一樣的,這裏針對最通用的、使Nginx支持更多併發請求的TCP網絡參數作簡單的配置

修改 /etc/sysctl.conf 來更改內核參數

fs.file-max = 999999
#表示單個進程最大能夠打開的句柄數;
net.ipv4.tcp_tw_reuse = 1
#參數設置爲 1 ,表示容許將TIME_WAIT狀態的socket從新用於新的TCP連接,這對於服務器來講意義重大,由於總有大量TIME_WAIT狀態的連接存在;
ner.ipv4.tcp_keepalive_time = 600
#當keepalive啓動時,TCP發送keepalive消息的頻度;默認是2小時,將其設置爲10分鐘,能夠更快的清理無效連接。
net.ipv4.tcp_fin_timeout = 30 
#當服務器主動關閉連接時,socket保持在FIN_WAIT_2狀態的最大時間
net.ipv4.tcp_max_tw_buckets = 5000
#這個參數表示操做系統容許TIME_WAIT套接字數量的最大值,若是超過這個數字,TIME_WAIT套接字將馬上被清除並打印警告信息。
#該參數默認爲180000,過多的TIME_WAIT套接字會使Web服務器變慢。
net.ipv4.ip_local_port_range = 1024 65000 
#定義UDP和TCP連接的本地端口的取值範圍。
net.ipv4.tcp_rmem = 10240 87380 12582912 
#定義了TCP接受緩存的最小值、默認值、最大值。
net.ipv4.tcp_wmem = 10240 87380 12582912 
#定義TCP發送緩存的最小值、默認值、最大值。
net.core.netdev_max_backlog = 8096 
#當網卡接收數據包的速度大於內核處理速度時,會有一個列隊保存這些數據包。這個參數表示該列隊的最大值。
net.core.rmem_default = 6291456 
#表示內核套接字接受緩存區默認大小。
net.core.wmem_default = 6291456 
#表示內核套接字發送緩存區默認大小。
net.core.rmem_max = 12582912 
#表示內核套接字接受緩存區最大大小。
net.core.wmem_max = 12582912 
#表示內核套接字發送緩存區最大大小。
注意:以上的四個參數,須要根據業務邏輯和實際的硬件成原本綜合考慮;
net.ipv4.tcp_syncookies = 1
#與性能無關。用於解決TCP的SYN攻擊。
net.ipv4.tcp_max_syn_backlog = 8192
#這個參數表示TCP三次握手創建階段接受SYN請求列隊的最大長度,默認1024,將其設置的大一些可使出現Nginx繁忙來不及accept新鏈接的狀況時,Linux不至於丟失客戶端發起的連接請求。
net.ipv4.tcp_tw_recycle = 1 
#這個參數用於設置啓用timewait快速回收。
net.core.somaxconn=262114 
# 選項默認值是128,這個參數用於調節系統同時發起的TCP鏈接數,在高併發的請求中,默認的值可能會致使連接超時或者重傳,所以須要結合高併發請求數來調節此值。
net.ipv4.tcp_max_orphans=262114 
#選項用於設定系統中最多有多少個TCP套接字不被關聯到任何一個用戶文件句柄上。若是超過這個數字,孤立連接將當即被複位並輸出警告信息。這個限制指示爲了防止簡單的DOS攻擊,不用過度依靠這個限制甚至認爲的減少這個值,更多的狀況是增長這個值。

 

生效配置

---下方不帶註釋的能夠直接複製

fs.file-max = 999999

net.ipv4.tcp_tw_reuse = 1

ner.ipv4.tcp_keepalive_time = 600

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_max_tw_buckets = 5000

net.ipv4.ip_local_port_range = 1024 65000

net.ipv4.tcp_rmem = 10240 87380 12582912

net.ipv4.tcp_wmem = 10240 87380 12582912

net.core.netdev_max_backlog = 8096

net.core.rmem_default = 6291456

net.core.wmem_default = 6291456

net.core.rmem_max = 12582912

net.core.wmem_max = 12582912

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_tw_recycle = 1

net.core.somaxconn=262114

net.ipv4.tcp_max_orphans=262114

修改好配置文件,執行 sysctl -p 命令,使配置當即生效

 

注意事項

1)開頭加解釋器:#!/bin/bash

2)語法縮進,使用四個空格;多加註釋說明。

3)命名建議規則:變量名大寫、局部變量小寫,函數名小寫,名字體現出實際做用。

4)默認變量是全局的,在函數中變量local指定爲局部變量,避免污染其餘做用域。

5)有兩個命令能幫助我調試腳本:set -e 遇到執行非0時退出腳本,set-x 打印執行過程。

6)寫腳本必定先測試再到生產上。

1 獲取隨機字符串或數字

獲取隨機8位字符串:

9個實戰及面試經常使用Shell腳本編寫

獲取隨機8位數字:

9個實戰及面試經常使用Shell腳本編寫

cksum:打印CRC效驗和統計字節

2 定義一個顏色輸出字符串函數

9個實戰及面試經常使用Shell腳本編寫

function關鍵字定義一個函數,可加或不加。

3 批量建立用戶

9個實戰及面試經常使用Shell腳本編寫

4 檢查軟件包是否安裝

9個實戰及面試經常使用Shell腳本編寫

5 檢查服務狀態

9個實戰及面試經常使用Shell腳本編寫

6 檢查主機存活狀態

方法1: 將錯誤IP放到數組裏面判斷是否ping失敗三次

9個實戰及面試經常使用Shell腳本編寫

方法2: 將錯誤次數放到FAIL_COUNT變量裏面判斷是否ping失敗三次

9個實戰及面試經常使用Shell腳本編寫

方法3: 利用for循環將ping通就跳出循環繼續,若是不跳出就會走到打印ping失敗

9個實戰及面試經常使用Shell腳本編寫

7 監控CPU、內存和硬盤利用率

1)CPU

藉助vmstat工具來分析CPU統計信息。

9個實戰及面試經常使用Shell腳本編寫

2)內存

9個實戰及面試經常使用Shell腳本編寫

3)硬盤

9個實戰及面試經常使用Shell腳本編寫

8 批量主機磁盤利用率監控

前提監控端和被監控端SSH免交互登陸或者密鑰登陸。

寫一個配置文件保存被監控主機SSH鏈接信息,文件內容格式:IP User Port

9個實戰及面試經常使用Shell腳本編寫

9 檢查網站可用性

1)檢查URL可用性

9個實戰及面試經常使用Shell腳本編寫

2)判斷三次URL可用性

思路與上面檢查主機存活狀態同樣。

9個實戰及面試經常使用Shell腳本編寫

本章寫的Shell腳本例子都比較實用,在面試題中也常常出現,但願你們參考着多動手寫寫,不要複製粘貼就拿來跑,這樣是學不會的!

時間格式轉換

[root@hchtest-ansible ~]# date -d "1 days ago" +%Y.%m.%d
2019.03.18

[root@hchtest-ansible ~]# date -d "1 days ago" +%Y-%m-%d
2019-03-18

統計某些文件大小總和

ls -l *.2019-03-16*.tar.gz|awk '{sum += $5};END{print sum/1024/1024/1024}'

 

 Linux只讀帳號配置

整個配置的命令以下(主要使用了:Linux bash受限的shell(RESTRICTED SHELL)

 

步驟
#1.建立只讀shell(這步能夠省略)

 

ln -s /bin/bash  /bin/rbash

 


#2.建立用戶並指定用戶啓動執行的shell

 

useradd -s /bin/bash readonly

這步不要指定rbash,否側cd等內建命令沒法使用

 


#3.修改用戶密碼

 

passwd readonly

 


#4.建立用戶shell執行命令目錄

 

mkdir /home/readonly/.bin

 


#5.root修改用戶的shell配置文件

 

chown root. /home/readonly/.bash_profile chmod 755 /home/readonly/.bash_profile

並設置文件不可刪除權限
chattr -i /home/readonly/.bash_profil

 


#6.修改bash配置文件,主要是指定PATH的讀取

 

複製代碼
vi /home/readonly/.bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs
#PATH=$PATH:$HOME/bin
PATH=$HOME/.bin
export PATH

#切換到只讀帳號使環境變量生效
su - readonly
source /home/readonly/.bash_profile
複製代碼

 


#7.將容許執行的命令連接到$HOME/.bin目錄

 

複製代碼
ln -s /usr/bin/wc /home/readonly/.bin/wc ln -s /usr/bin/tail /home/readonly/.bin/tail ln -s /bin/more /home/readonly/.bin/more ln -s /bin/cat /home/readonly/.bin/cat ln -s /bin/grep /home/readonly/.bin/grep ln -s /bin/find /home/readonly/.bin/find ln -s /bin/pwd /home/readonly/.bin/pwd ln -s /bin/ls /home/readonly/.bin/ls ln -s /bin/less /home/readonly/.bin/less ln -s /bin/tar /home/readonly/.bin/tar
複製代碼

 

 Linux 顯示隱藏目錄或隱藏文件的佔用空間

du -sh .[!.]* * | sort -hr

 

 斷文件是否更新

md5sum /usr/local/nginx/conf/blockip.conf > /root/blockip_md5_after
before=$(awk '{print $1}' /root/blockip_md5_before)
after=$(awk '{print $1}' /root/blockip_md5_after)
if [[ $before == $after ]];then
    echo 'blockip.conf is not changed'
else
    echo 'blockip.conf has been changed'
    /etc/init.d/nginx reload
fi

 

 


歡迎轉載,轉載請註明出處

相關文章
相關標籤/搜索