運(yùn)維常用linux命令\shell技巧范例
--------雪松整理
Q群: 198173206 歡迎linux系統(tǒng)運(yùn)維朋友加入!
錯(cuò)誤在所難免,還望指正!
==================================
1文件管理 2軟件管理 3系統(tǒng)管理
4服務(wù)管理 5網(wǎng)絡(luò)管理 6磁盤管理
7用戶管理 8腳本相關(guān)
==================================
----------------------------------
1文件管理
----------------------------------
創(chuàng)建空白文件
touch
不提示刪除非空目錄
rm -rf 目錄名
(-r:遞歸刪除 -f強(qiáng)制)
##################################
恢復(fù)rm刪除的文件(ext3)
查看磁盤分區(qū)格式
df -T
卸載掛載
umount /data/
ext3grep /dev/sdb1 --ls --inode 2
記錄信息繼續(xù)查找目錄下文件inode信息
ext3grep /dev/sdb1 --ls --inode 131081 # 此處是inode
記錄下inode信息開始恢復(fù)目錄
ext3grep /dev/sdb1 --restore-inode 49153
##################################
windows文本轉(zhuǎn)linux文本
dos2unix
linux文本轉(zhuǎn)windows文本
unix2dos
轉(zhuǎn)換編碼
iconv -f gbk -t utf8 原.txt > 新.txt
查看md5值
md5sum
硬鏈接
ln
符號(hào)連接
ln -s
查看上下翻頁且顯示行號(hào)
cat ? | nl |less
q退出
結(jié)束狀態(tài)
ctrl+z
查看文件開頭內(nèi)容
head
查看文件結(jié)尾內(nèi)容
tail -f # 監(jiān)視日志文件
檢查文件類型
file
重命名
rename
rename source_pattern target_pattern source_files
更改默認(rèn)權(quán)限
umask
按數(shù)字排序
sort -n
按數(shù)字倒敘
sort -nr
過濾重復(fù)行
sort -u
刪除重復(fù)的行
uniq
重復(fù)的行出現(xiàn)次數(shù)
uniq -c
只顯示不重復(fù)行
uniq -u
將兩個(gè)文件合并用tab鍵分隔開
paste a b
將兩個(gè)文件合并指定'+'符號(hào)隔開
paste -d'+' a b
將多行數(shù)據(jù)合并到一行用tab鍵隔開
paste -s a
設(shè)置隱藏屬性
chattr [+-=] [ASacdistu] 文件或目錄
給口令文件設(shè)置不可改變位
chattr +i /etc/passwd
向下分面器
more
搜索
locate 字符串
查看行數(shù)
wc -l
實(shí)時(shí)某個(gè)目錄下查看最新改動(dòng)過的文件
watch -d -n 1 'df; ls -FlAt /path'
快速備份一個(gè)文件
cp filename{,.bak}
##################################
配置編輯器
gconf-editor
vi 配置文件
vi /etc/vimrc
打開文件定位到24行
vi +24 /etc/passwd
vi加強(qiáng)版
vim
打開行號(hào)
:set nu
取消行號(hào)
:set nonu
跳轉(zhuǎn)到200
200G
取消高亮
:nohl
設(shè)置自動(dòng)縮進(jìn)
:set autoindent
查看文本格式
set ff
改為unix格式
set binary
向前翻頁
ctrl+ U
向后翻頁
ctrl+ D
全部替換
g/字符1/s//字符2/g
%s/字符1/字符2/g
# 普通用戶打開文檔不能保存
# tee是一個(gè)把stdin保存到文件的小工具,而%,是vim當(dāng)中一個(gè)只讀寄存器的名字,總保存著當(dāng)前編輯文件的文件路徑
:w !sudo tee %
##################################
按文件名查找
find /etc -name http
查找某一類型文件
find . -type f
按照文件權(quán)限查找
find / -perm
按照文件屬主查找
find / -user
按照文件所屬的組來查找文件
find / -group
文件使用時(shí)間在N天以內(nèi)
find / -atime -n
文件使用時(shí)間在N天以前
find / -atime +n
文件內(nèi)容改變時(shí)間在N天以內(nèi)
find / -mtime -n
文件內(nèi)容改變時(shí)間在N天以前
find / -mtime +n
文件狀態(tài)改變時(shí)間在N天前
find / -ctime +n
文件狀態(tài)改變時(shí)間在N天內(nèi)
find / -ctime -n
# linux文件無創(chuàng)建時(shí)間
# Access 使用時(shí)間
# Modify 內(nèi)容修改時(shí)間
# Change 狀態(tài)改變時(shí)間(權(quán)限、屬主)
查找文件長(zhǎng)度大于1M字節(jié)的文件
find / -size +1000000c -print
按名字查找文件傳遞給-exec后命令
find /etc -name "passwd*" -exec grep "xuesong" {} \;
查找文件名,不取路徑
find . -name 't*' -exec basename {} \;
##################################
====================================================================
----------------------------------
2軟件管理
----------------------------------
解包tar
tar xvf 1.tar -C 目錄
打包tar
tar -cvf 1.tar *
查看tar
tar tvf 1.tar
給tar追加文件
tar -rvf 1.tar 文件名
解包gz
tar zxvpf gz.tar.gz -C 放到指定目錄 包中的目錄
打包gz
tar zcvpf gz.tar.gz
查看gz
tar ztvpf gz.tar.gz
解壓bzip2
bzip2 -dv 1.tar.bz2
解壓gzip到tar
gzip -dv 1.tar.gz
壓縮tar到gz
gzip -v 1.tar
bzip2壓縮
bzip2 -v 1.tar
查看bzip2
bzcat
rpm安裝
rpm -ivh
卸載
rpm -e lynx
強(qiáng)制卸載
rpm -e lynx --nodeps
測(cè)試
rpm --test lynx
查看所有安裝的rpm包
rpm -qa
查找包是否安裝
rpm -qa | grep http
升級(jí)包
rpm -Uvh
解壓zip
unzip zip.zip
壓縮zip
zip zip.zip *
rar3.6下載地址
http://www.rarsoft.com/rar/rarlinux-3.6.0.tar.gz
壓縮文件為rar包
rar a rar.rar *.jpg
解壓rar包
unrar x rar.rar
7z壓縮
7z a 7z.7z *
7z解壓
7z e 7z.7z
查看字符行
zgrep 字符 1.gz
打包/home, /etc ,但排除 /home/dmtsai
tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc
在 /home 當(dāng)中,比 2005/06/01 新的文件才備份
tar -N "2005/06/01" -zcvf home.tar.gz /home
下載
wgetrc
文本上網(wǎng)
lynx
制作鏡像
cp -v /dev/dvd /software/rhel4.6.iso9660
清除編譯結(jié)果
make clean
源碼安裝
./configure --help |less
./configure --prefix=/usr/local/
make
make install
perl程序編譯
perl Makefile.PL
make
make test
make install
perl程序編譯
python file.py
編譯c程序
gcc -g hello.c -o hello
====================================================================
----------------------------------
3系統(tǒng)管理
----------------------------------
終端鎖屏 Ctrl+S
解鎖屏 Ctrl+Q
PS1環(huán)境變量控制提示顯示
PS1='[\u@ \H \w \A \@#]\$'
開機(jī)啟動(dòng)模式(3為多用戶命令)
vi /etc/inittab
禁止 ctrl + alt + del 關(guān)閉計(jì)算機(jī)
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
查找命令的目錄
whereis
查看當(dāng)前要執(zhí)行的命令所在的路徑
which
讓部命令后臺(tái)運(yùn)行
命令 &
將前臺(tái)放入后臺(tái)(暫停)
ctrl+z
查看后臺(tái)運(yùn)行程序
jobs
啟動(dòng)后臺(tái)暫停進(jìn)程
bg 2
調(diào)回后臺(tái)進(jìn)程
fg 2
后臺(tái)運(yùn)行不受shell退出影響
nohup cmd &
清空整個(gè)屏幕
clear
重新初始化屏幕
reset
查詢用過的命令默認(rèn)1000條
history
清楚記錄命令
history -c
cat /root/.bash_history
查看登陸過的用戶信息
last
last -n user
who /var/log/wtmp
列出登錄系統(tǒng)失敗的用戶相關(guān)信息
lastb -a
/var/log/btmp
防火墻日志
tail -f /var/log/messages
ssh日志
tail -f /var/log/secure
隨機(jī)生成密碼
mkpasswd
-l位數(shù) -C大小 -c小寫 -d數(shù)字 -s特殊字符
mkpasswd -l 8 -C 2 -c 2 -d 4 -s 0
當(dāng)前在線用戶
who
w
查看當(dāng)前用戶名
whoami
查看登陸用戶名
logname
顯示月歷
cal
查看服務(wù)器啟動(dòng)時(shí)間
uptime
設(shè)日期
date -s 20091112
設(shè)時(shí)間
date -s 18:30:50
同步時(shí)間
/usr/sbin/ntpdate stdtime.gov.hk
7天前日期
`date -d "7 days ago" +%Y%m%d`
日期格式轉(zhuǎn)換
`date +%Y-%m-%d -d '20110902'`
日期和時(shí)間
date +%Y-%m-%d_%X
查看時(shí)間
hwclock
賬戶影子文件
/etc/shadow
列出所有語系
locale -a
修改語言
LANG=en
修改編碼
vi /etc/sysconfig/i18n
utf-8 <---> GBK
強(qiáng)制字符集
export LC_ALL=C
查詢靜態(tài)主機(jī)名
vi /etc/hosts
最大連接
/etc/security/limits.conf
grub開機(jī)啟動(dòng)項(xiàng)添加
/etc/grub.conf
title ms-dos
rootnoverify (hd0,0)
chainloader +1
別名
alias
監(jiān)測(cè)命令
watch
查看Linux版本信息
uname -a
cat /proc/version
cat /etc/issue
lsb_release -a
查看cpu信息
more /proc/cpuinfo
查看cpu型號(hào)和邏輯核心數(shù)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
cpu運(yùn)行的位數(shù)
getconf LONG_BIT
物理cpu個(gè)數(shù)
cat /proc/cpuinfo | grep physical | uniq -c
結(jié)果大于0支持64位
cat /proc/cpuinfo | grep flags | grep ' lm ' | wc -l
查看cpu是否支持虛擬化
cat /proc/cpuinfo|grep flags
pae支持半虛擬化 Intel VT 支持全虛擬化
查看內(nèi)存信息
more /proc/meminfo
查看全面硬件信息
dmidecode
查看服務(wù)器型號(hào)
dmidecode | grep "Product Name"
查看軟raid信息
cat /proc/mdstat
查看硬raid信息
cat /proc/scsi/scsi
查看硬件信息
lspci
查看是否支持raid
lspci|grep RAID
顯示開機(jī)信息
dmesg
進(jìn)程樹
pstree
每隔一秒報(bào)告虛擬內(nèi)存統(tǒng)計(jì)信息9次
vmstat 1 9
把180號(hào)進(jìn)程的優(yōu)先級(jí)加1
renice +1 180
終止某個(gè)PID進(jìn)程
kill -9 PID
指定三天后下午5:00執(zhí)行/bin/ls
at 5pm + 3 days /bin/ls
編輯周期任務(wù)
crontab -e
分鐘 小時(shí) 天 月 星期 命令或腳本
01 1-3/2 * * * 命令或腳本
直接將命令寫入周期任務(wù)
echo "40 7 * * 2 /root/sh">>/var/spool/cron/root
查看自動(dòng)周期性任務(wù)
crontab -l
刪除自動(dòng)周期性任務(wù)
crontab -r
禁止或允許用戶使用周期任務(wù)
cron.deny和cron.allow
啟動(dòng)自動(dòng)周期性服務(wù)
service crond 啟動(dòng)|停止|重啟|狀態(tài)>
是否打開了某個(gè)端口
netstat -anlp | grep 端口號(hào)
sudo命令權(quán)限添加
visudo
用戶 別名(可用all)=NOPASSWD:命令1,命令2
wangming linuxfan=NOPASSWD:/sbin/apache start,/sbin/apache restart
UserName ALL=(ALL) ALL
制作補(bǔ)丁
diff suzu.c suzu2.c > sz.patch
安裝補(bǔ)丁
patch suzu.c < sz.patch
顯示打開指定文件的所有進(jìn)程
lsof 文件
查看端口的進(jìn)程
lsof -i :32768
顯示消耗內(nèi)存最多的10個(gè)運(yùn)行中的進(jìn)程,以內(nèi)存使用量排序.cpu +3
ps aux |grep -v USER | sort -nk +4 | tail
查看內(nèi)核模塊
lsmod
yum擴(kuò)展源
http://download.fedoraproject.org/pub/epel
wget http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
rpm -Uvh epel-release-5-4.noarch.rpm
升級(jí)所有包版本,依賴關(guān)系,系統(tǒng)版本內(nèi)核都升級(jí)
yum -y update
升級(jí)指定的軟件包
yum -y update 軟件包名
不改變軟件設(shè)置更新軟件,系統(tǒng)版本升級(jí),內(nèi)核不改變
yum -y upgrade
yum搜索相關(guān)包
yum search mail
會(huì)改變配置文件,改變舊的依賴關(guān)系,改變系統(tǒng)版本
dist-upgrade
編輯啟動(dòng)項(xiàng)
/boot/grub/grub.conf
開機(jī)啟動(dòng)腳本順序
/etc/profile
/etc/profile.d/*.sb
~/bash_profile
~/.bashrc
/etc/bashrc
使TCP SYN Cookie 保護(hù)生效 # "SYN Attack"是一種拒絕服務(wù)的攻擊方式
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
--------------------------------------------------------------------
top
前五行是系統(tǒng)整體的統(tǒng)計(jì)信息。
第一行是任務(wù)隊(duì)列信息,同 uptime 命令的執(zhí)行結(jié)果。其內(nèi)容如下:
01:06:48 當(dāng)前時(shí)間
up 1:22 系統(tǒng)運(yùn)行時(shí)間,格式為時(shí):分
1 user 當(dāng)前登錄用戶數(shù)
load average: 0.06, 0.60, 0.48 系統(tǒng)負(fù)載,即任務(wù)隊(duì)列的平均長(zhǎng)度。
三個(gè)數(shù)值分別為 1分鐘、5分鐘、15分鐘前到現(xiàn)在的平均值。
第二、三行為進(jìn)程和CPU的信息。當(dāng)有多個(gè)CPU時(shí),這些內(nèi)容可能會(huì)超過兩行。內(nèi)容如下:
Tasks: 29 total 進(jìn)程總數(shù)
1 running 正在運(yùn)行的進(jìn)程數(shù)
28 sleeping 睡眠的進(jìn)程數(shù)
0 stopped 停止的進(jìn)程數(shù)
0 zombie 僵尸進(jìn)程數(shù)
Cpu(s): 0.3% us 用戶空間占用CPU百分比
1.0% sy 內(nèi)核空間占用CPU百分比
0.0% ni 用戶進(jìn)程空間內(nèi)改變過優(yōu)先級(jí)的進(jìn)程占用CPU百分比
98.7% id 空閑CPU百分比
0.0% wa 等待輸入輸出的CPU時(shí)間百分比
0.0% hi
0.0% si
最后兩行為內(nèi)存信息。內(nèi)容如下:
Mem: 191272k total 物理內(nèi)存總量
173656k used 使用的物理內(nèi)存總量
17616k free 空閑內(nèi)存總量
22052k buffers 用作內(nèi)核緩存的內(nèi)存量
Swap: 192772k total 交換區(qū)總量
0k used 使用的交換區(qū)總量
192772k free 空閑交換區(qū)總量
123988k cached 緩沖的交換區(qū)總量。
內(nèi)存中的內(nèi)容被換出到交換區(qū),而后又被換入到內(nèi)存,但使用過的交換區(qū)尚未被覆蓋,
該數(shù)值即為這些內(nèi)容已存在于內(nèi)存中的交換區(qū)的大小。
相應(yīng)的內(nèi)存再次被換出時(shí)可不必再對(duì)交換區(qū)寫入。
進(jìn)程信息區(qū)
統(tǒng)計(jì)信息區(qū)域的下方顯示了各個(gè)進(jìn)程的詳細(xì)信息。首先來認(rèn)識(shí)一下各列的含義。
序號(hào) 列名 含義
a PID 進(jìn)程id
b PPID 父進(jìn)程id
c RUSER Real user name
d UID 進(jìn)程所有者的用戶id
e USER 進(jìn)程所有者的用戶名
f GROUP 進(jìn)程所有者的組名
g TTY 啟動(dòng)進(jìn)程的終端名。不是從終端啟動(dòng)的進(jìn)程則顯示為 ?
h PR 優(yōu)先級(jí)
i NI nice值。負(fù)值表示高優(yōu)先級(jí),正值表示低優(yōu)先級(jí)
j P 最后使用的CPU,僅在多CPU環(huán)境下有意義
k %CPU 上次更新到現(xiàn)在的CPU時(shí)間占用百分比
l TIME 進(jìn)程使用的CPU時(shí)間總計(jì),單位秒
m TIME+ 進(jìn)程使用的CPU時(shí)間總計(jì),單位1/100秒
n %MEM 進(jìn)程使用的物理內(nèi)存百分比
o VIRT 進(jìn)程使用的虛擬內(nèi)存總量,單位kb。VIRT=SWAP+RES
p SWAP 進(jìn)程使用的虛擬內(nèi)存中,被換出的大小,單位kb。
q RES 進(jìn)程使用的、未被換出的物理內(nèi)存大小,單位kb。RES=CODE+DATA
r CODE 可執(zhí)行代碼占用的物理內(nèi)存大小,單位kb
s DATA 可執(zhí)行代碼以外的部分(數(shù)據(jù)段+棧)占用的物理內(nèi)存大小,單位kb
t SHR 共享內(nèi)存大小,單位kb
u nFLT 頁面錯(cuò)誤次數(shù)
v nDRT 最后一次寫入到現(xiàn)在,被修改過的頁面數(shù)。
w S 進(jìn)程狀態(tài)。
D=不可中斷的睡眠狀態(tài)
R=運(yùn)行
S=睡眠
T=跟蹤/停止
Z=僵尸進(jìn)程
x COMMAND 命令名/命令行
y WCHAN 若該進(jìn)程在睡眠,則顯示睡眠中的系統(tǒng)函數(shù)名
z Flags 任務(wù)標(biāo)志,參考 sched.h
##################################
iptables
內(nèi)建三個(gè)表:nat mangle 和 filter
filter預(yù)設(shè)規(guī)則表,有INPUT、FORWARD 和 OUTPUT 三個(gè)規(guī)則鏈
INPUT 進(jìn)入
FORWARD 轉(zhuǎn)發(fā)
OUTPUT 出去
ACCEPT 將封包放行
REJECT 攔阻該封包
DROP 丟棄封包不予處理
-A 在所選擇的鏈(INPUT等)末添加一條或更多規(guī)則
-D 刪除一條
-E 修改
-p tcp、udp、icmp 0相當(dāng)于所有all !取反
-P 設(shè)置缺省策略(與所有鏈都不匹配強(qiáng)制使用此策略)
-s IP/掩碼 (IP/24) 主機(jī)名、網(wǎng)絡(luò)名和清楚的IP地址 !取反
-j 目標(biāo)跳轉(zhuǎn),立即決定包的命運(yùn)的專用內(nèi)建目標(biāo)
-i 進(jìn)入的(網(wǎng)絡(luò))接口 [名稱] eth0
-o 輸出接口[名稱]
-m 模塊
--sport 源端口
--dport 目標(biāo)端口
#配置文件
vi /etc/sysconfig/iptables
#將防火墻中的規(guī)則條目清除掉
iptables -F
#注意:iptables -P INPUT ACCEPT
#導(dǎo)入防火墻規(guī)則
iptables-restore <規(guī)則文件
#保存防火墻設(shè)置
/etc/init.d/iptables save
#重啟防火墻服務(wù)
/etc/init.d/iptables restart
#查看規(guī)則
iptables -L -n
iptables -L -n --line-numbers
#從某個(gè)規(guī)則鏈中刪除一條規(guī)則
iptables -D INPUT --dport 80 -j DROP
iptables -D INPUT 8
#取代現(xiàn)行規(guī)則
iptables -R INPUT 8 -s 192.168.0.1 -j DROP
#插入一條規(guī)則
iptables -I INPUT 8 --dport 80 -j ACCEPT
#查看轉(zhuǎn)發(fā)
iptables -t nat -nL
#在內(nèi)核里打開ip轉(zhuǎn)發(fā)功能
echo 1 > /proc/sys/net/ipv4/ip_forward
##################################
#允許本地回環(huán)
iptables -A INPUT -s 127.0.0.1 -p tcp -j ACCEPT
#允許已建立的或相關(guān)連的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#開放對(duì)外訪問
iptables -P OUTPUT ACCEPT
#指定某端口針對(duì)IP開放
iptables -A INPUT -s 192.168.10.37 -p tcp --dport 22 -j ACCEPT
#允許的IP或IP段訪問
iptables -A INPUT -s 192.168.10.37 -p tcp -j ACCEPT
#開放對(duì)外開放端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#關(guān)閉入口
iptables -P INPUT DROP
#關(guān)閉轉(zhuǎn)發(fā)
iptables -P FORWARD DROP
##################################
iptables規(guī)則文件
# Generated by iptables-save v1.2.11 on Fri Feb 9 12:10:37 2007
*filter
:INPUT DROP [637:58967]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [5091:1301533]
#允許的IP或IP段訪問
-A INPUT -s 127.0.0.1 -p tcp -j ACCEPT
-A INPUT -s 192.168.0.0/255.255.0.0 -p tcp -j ACCEPT
#開放對(duì)外開放端口
-A INPUT -p tcp --dport 80 -j ACCEPT
#指定某端口針對(duì)IP開放
-A INPUT -s 192.168.10.37 -p tcp --dport 22 -j ACCEPT
#拒絕所有協(xié)議(INPUT允許的情況)
#-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,URG RST -j DROP
# 允許已建立的或相關(guān)連的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#拒絕ping
-A INPUT -p tcp -m tcp -j REJECT --reject-with icmp-port-unreachable
COMMIT
# Completed on Fri Feb 9 12:10:37 2007
##################################
常用實(shí)例
#允許在IP訪問指定端口
iptables -A INPUT -s 192.168.62.1 -p tcp --dport 22 -j ACCEPT
#禁止使用某端口
iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp --dport 31 -j REJECT
#禁止QQ端口
iptables -D FORWARD -p udp --dport 8000 -j REJECT
#禁止icmp端口
#除192.168.62.1外,禁止其它人ping我的主機(jī)
iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP
#其它情況不允許
iptables -A INPUT -i eth0 -j DROP
#禁止指定IP訪問
iptables -A INPUT -p tcp -s IP -j DROP
#禁止指定IP訪問端口
iptables -A INPUT -p tcp -s IP --dport port -j DROP
#阻止所有沒有經(jīng)過你系統(tǒng)授權(quán)的TCP連接
iptables -t filter -A INPUT -i eth0 -p tcp --syn -j DROP
#添加網(wǎng)段轉(zhuǎn)發(fā)
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
#IP包流量限制
iptables -A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -j DROP
#端口映射
iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.62.0/24 --dport 80 -j REDIRECT --to-ports 3128
#列出某規(guī)則鏈中的所有規(guī)則
iptables -L INPUT
#刪除某個(gè)規(guī)則鏈 ,不加規(guī)則鏈,清除所有非內(nèi)建的
iptables -X allowed
#將封包計(jì)數(shù)器歸零
iptables -Z INPUT
#定義新的規(guī)則鏈
iptables -N allowed
#定義過濾政策
iptables -P INPUT DROP
#修改某自訂規(guī)則鏈的名稱
iptables -E allowed disallowed
#比對(duì)通訊協(xié)議類型是否相符
#-p ! tcp 排除tcp以外的udp、icmp。-p all所有類型
iptables -A INPUT -p tcp
#比對(duì)封包的來源 IP
#192.168.0.0/24 ! 反向?qū)Ρ?br>iptables -A INPUT -s 192.168.1.1
#比對(duì)封包的目的地 IP
iptables -A INPUT -d 192.168.1.1
#比對(duì)封包是從哪片網(wǎng)卡進(jìn)入
#eth+表示所有的網(wǎng)卡
iptables -A INPUT -i eth0
#比對(duì)封包要從哪片網(wǎng)卡送出
iptables -A FORWARD -o eth0
#比對(duì)某段時(shí)間內(nèi)封包的平均流量
#例子是用來比對(duì):每小時(shí)平均流量是否超過一次 3 個(gè)封包。 除了每小時(shí)平均次外,也可以每秒鐘、每分鐘或每天平均一次,默認(rèn)值為每小時(shí)平均一次,參數(shù)如后: /second、 /minute、/day。 除了進(jìn)行封數(shù)量的比對(duì)外,設(shè)定這個(gè)參數(shù)也會(huì)在條件達(dá)成時(shí),暫停封包的比對(duì)動(dòng)作,以避免因駭客使用洪水攻擊法,導(dǎo)致服務(wù)被阻斷。
iptables -A INPUT -m limit --limit 3/hour
#比對(duì)瞬間大量封包的數(shù)量
#例子是用來比對(duì)一次同時(shí)涌入的封包是否超過 5 個(gè)(這是默認(rèn)值),超過此上限的封包將被直接丟棄。使用效果同上。
iptables -A INPUT -m limit --limit-burst 5
#比對(duì)來自本機(jī)的封包
#是否為某特定使用者所產(chǎn)生的,這樣可以避免服務(wù)器使用root或其它身分將敏感數(shù)據(jù)傳送出,可以降低系統(tǒng)被駭?shù)膿p失??上н@個(gè)功能無法比對(duì)出來自其它主機(jī)的封包。
iptables -A OUTPUT -m owner --uid-owner 500
#比對(duì)來自本機(jī)的封包
iptables -A OUTPUT -m owner --gid-owner 0
iptables -A OUTPUT -m owner --pid-owner 78
iptables -A OUTPUT -m owner --sid-owner 100
#用來比對(duì)聯(lián)機(jī)狀態(tài)
iptables -A INPUT -m state --state RELATED,ESTABLISHED
聯(lián)機(jī)狀態(tài)共有四種:INVALID、ESTABLISHED、NEW 和 RELATED。
#-j參數(shù)指定進(jìn)行的處理動(dòng)作,處理動(dòng)作包括:ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,說明:
iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset
#可以傳送的封包有幾個(gè)選擇:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset
REDIRECT 將封包重新導(dǎo)向到另一個(gè)端口(PNAT)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
MASQUERADE 改寫封包來源 IP 為防火墻 NIC IP
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
LOG 將封包相關(guān)訊息紀(jì)錄在 /var/log 中
iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
SNAT 改寫封包來源 IP 為某特定 IP 或 IP 范圍
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
DNAT 改寫封包目的地 IP 為某特定 IP 或 IP 范圍
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100
MIRROR 鏡射封包
QUEUE 中斷過濾程序
RETURN 結(jié)束在目前規(guī)則煉中的過濾程序
MARK 將封包標(biāo)上某個(gè)代號(hào)
##################################
iptables配置實(shí)例
允許某段IP訪問任何端口
iptables -A INPUT -s 192.168.0.3/24 -p tcp -j ACCEPT
設(shè)定預(yù)設(shè)規(guī)則 (拒絕所有的數(shù)據(jù)包,再允許需要的,如只做WEB服務(wù)器.還是推薦三個(gè)鏈都是DROP)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
(注:意直接設(shè)置這三條完已經(jīng)掉線了)
開啟22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
如果OUTPUT 設(shè)置成DROP的,要寫上下面一條
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
(注:,不寫導(dǎo)致無法SSH.其他的端口一樣,OUTPUT設(shè)置成DROP的話,也要添加一條鏈)
如果開啟了web服務(wù)器,OUTPUT設(shè)置成DROP的話,同樣也要添加一條鏈
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
做WEB服務(wù)器,開啟80端口 ,其他同理
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
做郵件服務(wù)器,開啟25,110端口
iptables -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -p tcp --dport 25 -j ACCEPT
允許icmp包通過,允許ping
iptables -A OUTPUT -p icmp -j ACCEPT (OUTPUT設(shè)置成DROP的話)
iptables -A INPUT -p icmp -j ACCEPT (INPUT設(shè)置成DROP的話)
允許loopback!(不然會(huì)導(dǎo)致DNS無法正常關(guān)閉等問題)
IPTABLES -A INPUT -i lo -p all -j ACCEPT (如果是INPUT DROP)
IPTABLES -A OUTPUT -o lo -p all -j ACCEPT(如果是OUTPUT DROP)
====================================================================
----------------------------------
4服務(wù)管理
----------------------------------
啟動(dòng)sendmail服務(wù)
./sendmail start
/etc/init.d/sendmail start
關(guān)閉sendmail服務(wù)
./sendmail stop
查看sendmail服務(wù)當(dāng)前狀態(tài)
./sendmail status
發(fā)送郵件
echo 內(nèi)容| /bin/mail -s "標(biāo)題" 收件箱
"`echo "內(nèi)容"|iconv -f utf8 -t gbk`" | /bin/mail -s "`echo "標(biāo)題"|iconv -f utf8 -t gbk`" 收件箱
打開服務(wù)列表 需要打*
ntsysv
讓某個(gè)服務(wù)不自動(dòng)啟動(dòng) 35指的是運(yùn)行級(jí)別
httpd:chkconfig --level 35 httpd off
讓某個(gè)服務(wù)自動(dòng)啟動(dòng)
httpd:chkconfig --level 35 httpd on
查看所有服務(wù)的啟動(dòng)狀態(tài)
chkconfig --list
查看某個(gè)服務(wù)的啟動(dòng)狀態(tài)
chkconfig --list |grep httpd
查看服務(wù)的狀態(tài)
chkconfig –-list [服務(wù)名稱]
設(shè)置非獨(dú)立服務(wù)啟狀態(tài)
chkconfig 服務(wù)名 on|off|set
開啟mysql后臺(tái)運(yùn)行
/usr/local/mysql/bin/mysqld_safe --user=mysql &
開機(jī)啟動(dòng)執(zhí)行
vi /etc/rc.d/rc.local
開機(jī)啟動(dòng)和關(guān)機(jī)關(guān)閉服務(wù)連接
/etc/rc.d/rc3.d/S55sshd
# S開機(jī)start K關(guān)機(jī)stop 55級(jí)別 后跟服務(wù)名
ln -s -f /usr/local/httpd/bin/apachectl /etc/rc.d/rc3.d/S15httpd
====================================================================
----------------------------------
5網(wǎng)絡(luò)管理
----------------------------------
##################################
本機(jī)網(wǎng)絡(luò)配置文件
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
BROADCAST=192.168.1.255
HWADDR=00:0C:29:3F:E1:EA
IPADDR=192.168.1.55
NETMASK=255.255.255.0
NETWORK=192.168.1.0
ONBOOT=yes
TYPE=Ethernet
GATEWAY=192.168.1.1
##################################
增加邏輯IP地址
ifconfig eth0:0 192.168.1.221 netmask 255.255.255.0
查看路由表
route
添加路由表
route add default gw 192.168.1.1 dev eth0
設(shè)置DNS
vi /etc/resolv.conf
禁用網(wǎng)卡
ifconfig eth0 down
啟用網(wǎng)卡
ifconfig eth0 up
ifup eth0:0 up
測(cè)試跳數(shù)
traceroute www.baidu.com (linux)
tracert www.baidu.com (windows)
根據(jù)IP和主機(jī)最大數(shù)計(jì)算掩碼
ipcalc -m "$ip" -p "$num"
用 wget 的遞歸方式下載整個(gè)網(wǎng)站
wget --random-wait -r -p -e robots=off -U Mozilla www.example.com
通過 DNS 來讀取 Wikipedia 的hacker詞條
dig +short txt hacker.wp.dg.cx
host -t txt hacker.wp.dg.cx
rz ssh小文件上傳
sz ssh小文件下載
從linux ssh登錄另一臺(tái)linux
ssh -p 22 wang@192.168.1.209
利用ssh操作遠(yuǎn)程主機(jī)
ssh -p 22 root@192.168.1.209 環(huán)境變量中腳本
把本地文件拷貝到遠(yuǎn)程主機(jī)
scp -P 22 文件 root@ip:/目錄
ssh連接不提示yes
ssh -o StrictHostKeyChecking=no 192.168.70.130
把遠(yuǎn)程指定文件拷貝到本地
scp root@192.168.1.209:遠(yuǎn)程目錄 本地目錄
通過 SSH 掛載遠(yuǎn)程主機(jī)上的文件夾
sshfs name@server:/path/to/folder /path/to/mount/point
卸載的話使用 fusermount 命令
fusermount -u /path/to/mount/point
用DIFF對(duì)比遠(yuǎn)程文件跟本地文件
ssh user@host cat /path/to/remotefile | diff /path/to/localfile -
用SSH創(chuàng)建端口轉(zhuǎn)發(fā)通道
ssh -N -L2001:remotehost:80 user@somemachine
嵌套使用SSH
ssh -t host_A ssh host_B
密鑰信任
ssh-keygen –t rsa
vi 用戶/.ssh/authorized_keys
遠(yuǎn)程關(guān)掉一臺(tái)WINDOWS機(jī)器
net rpc shutdown -I IP_ADDRESS -U username%password
禁ping
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
抓包
tcpdump tcp port 22
查看監(jiān)聽
netstat -anlp
-a 顯示所有連接中的Socket
-t 顯示TCP連接
-u 顯示UDP連接
-n 顯示所有已建立的有效連接
##################################
先ping在掃描主機(jī)開放端口
nmap -PT 192.168.1.1-111
掃描出系統(tǒng)內(nèi)核版本
nmap -O 192.168.1.1
掃描端口的軟件版本
nmap -sV 192.168.1.1-111
半開掃描(通常不會(huì)記錄日志)
nmap -sS 192.168.1.1-111
不支持windows的掃描(判斷是否是windows)
nmap -sF 192.168.1.1-111
nmap -sX 192.168.1.1-111
nmap -sN 192.168.1.1-111
不ping直接掃描
nmap -P0 192.168.1.1-111
詳細(xì)信息
nmap -d 192.168.1.1-111
無法找出真正掃描主機(jī)(隱藏IP)
nmap -D 192.168.1.1-111
端口范圍
nmap -p 20-30,139,60000-
表示:掃描20到30號(hào)端口,139號(hào)端口以及所有大于60000的端口
組合掃描(不ping、軟件版本、內(nèi)核版本、詳細(xì)信息)
nmap -P0 -sV -O -v 192.168.30.251
##################################
====================================================================
----------------------------------
6磁盤管理
----------------------------------
查看硬盤容量
df -h
查看磁盤分區(qū)格式
df -T
修改只讀文件系統(tǒng)為讀寫
mount -o remount,rw /
查看卷標(biāo)
e2label /dev/sda5
創(chuàng)建卷標(biāo)
e2label /dev/sda5 new-label
NTFS添加卷標(biāo)
ntfslabel -v /dev/sda8 new-label
ext2分區(qū)轉(zhuǎn)ext3分區(qū)
tune2fs -j /dev/sda
格式化分區(qū)
mkfs -t ext3 /dev/hda3
指定索引塊大小
mke2fs -b 2048 /dev/sda5
對(duì)文件系統(tǒng)修復(fù)
fsck -y /dev/sda6
查看超級(jí)塊的信息
dumpe2fs -h /dev/sda5
查看當(dāng)前系統(tǒng)支持文件系統(tǒng)
cat /proc/filesystems
檢測(cè)硬盤狀態(tài)
smartctl -H /dev/sda
檢測(cè)硬盤信息
smartctl -i /dev/sda
檢測(cè)所有信息
smartctl -a /dev/sda
檢測(cè)目錄下所有文件大小
du -h 目錄
顯示當(dāng)前目錄中子目錄的大小
du -h --max-depth=1
掛載光驅(qū)
mount -t iso9660 /dev/dvd /mnt
掛載鏡像文件
mount -o loop /software/rhel4.6.iso /mnt/
##################################
磁盤grub開機(jī)引導(dǎo)項(xiàng)添加
/etc/grub.conf
title ms-dos
rootnoverify (hd0,0)
chainloader +1
##################################
建立軟RAID1
兩塊硬盤分區(qū)一樣,分別新建分區(qū)文件類型為software RAID
創(chuàng)建兩個(gè)就點(diǎn)擊raid合并為RAID1,這里的掛載點(diǎn)為正常linux目錄
查看raid工作狀態(tài)
cat /proc/mdstat
兩個(gè)盤都加grub引導(dǎo)
查看
cat /boot/grub/grub.conf
grub
root (hd0,0)
setup (hd0)
root (hd1,0)
setup (hd1)
修改grub啟動(dòng)項(xiàng)配置文件
vi /boot/grub/grub.conf
復(fù)制title CentOS到最后的四行
在下面粘貼修改為剛才新加的引導(dǎo)(hd1,0)。
查看分區(qū)
sfdisk -d /dev/hda
導(dǎo)出A盤分區(qū)列表
sfdisk -d /dev/hda > fq.hda
將分區(qū)列表導(dǎo)入到新加的硬盤
sfdisk /dev/hdb < fq.hda
恢復(fù)新掛載的硬盤分區(qū)
mdadm /dev/md1 -a /dev/hdb5
# raid5可利用lvm擴(kuò)容
##################################
新硬盤掛載
fdisk /dev/sdc
p # 打印分區(qū)
d # 刪除分區(qū)
n # 創(chuàng)建分區(qū),(一塊硬盤最多4個(gè)主分區(qū),擴(kuò)展占一個(gè)主分區(qū)位置。p主分區(qū) e擴(kuò)展)
w # 保存退出
mkfs -t ext3 -L 卷標(biāo) /dev/sdc1 # 格式化相應(yīng)分區(qū)
mount /dev/sdc1 /mnt # 掛載
添加開機(jī)掛載分區(qū)
vi /etc/fstab
用卷標(biāo)掛載
LABEL=/data /data ext3 defaults 1 2
用真實(shí)分區(qū)掛載
/dev/sdb1 /data4 ext3 defaults 1 2
第一個(gè)數(shù)字"1"該選項(xiàng)被"dump"命令使用來檢查一個(gè)文件系統(tǒng)應(yīng)該以多快頻率進(jìn)行轉(zhuǎn)儲(chǔ),若不需要轉(zhuǎn)儲(chǔ)就設(shè)置該字段為0
第二個(gè)數(shù)字"2"該字段被fsck命令用來決定在啟動(dòng)時(shí)需要被掃描的文件系統(tǒng)的順序,根文件系統(tǒng)"/"對(duì)應(yīng)該字段的值應(yīng)該為1,其他文件系統(tǒng)應(yīng)該為2。若該文件系統(tǒng)無需在啟動(dòng)時(shí)掃描則設(shè)置該字段為0
##################################
====================================================================
----------------------------------
7用戶管理
----------------------------------
建立用戶
useradd xuesong
修改密碼
passwd 用戶
echo "xuesong" | passwd xuesong --stdin
恢復(fù)密碼
在linux出現(xiàn)grub后,在安裝的系統(tǒng)上面按"e",然后出現(xiàn)grub的配置文件,按鍵盤移動(dòng)光標(biāo)到第二行"Ker……",再按"e",然后在這一行的結(jié)尾加上:空格 single或者空格1回車,然后按"b"重啟,就進(jìn)入了"單用戶模式"。
查找用戶顯示信息
finger
添加組
groupadd
修改文件擁有者(R遞歸)
chown -R
修改所有者用戶中包含點(diǎn)"."
chown y\.li:mysql
修改用戶組
chgrp
修改用戶名
usermod -l 新用戶名 老用戶名
修改用戶所屬組
usermod -g user group
修改用戶家目錄
usermod -d 目錄 -m 用戶
將用戶添加到附加組
usermod -G user group
刪除賬號(hào)及家目錄
userdel -r
指定組并不允許登錄的用戶
useradd -g www -M -s /sbin/nologin www
切換用戶執(zhí)行
su - user -c "
#命令1
"
====================================================================
----------------------------------
8腳本相關(guān)
----------------------------------
##################################
正則表達(dá)式
^ 行首定位
$ 行為定位
. 匹配除換行符以外的任意字符
* 匹配0或多個(gè)重復(fù)字符
+ 重復(fù)一次或更多次
重復(fù)零次或一次
[] 匹配一組中任意一個(gè)字符
[^] 匹配不在指定組內(nèi)的字符
\ 用來轉(zhuǎn)義元字符
\< 詞首定位符(支持vi和grep)
\<love
\> 詞尾定位符(支持vi和grep)
love\>
x\{m\} 重復(fù)出現(xiàn)m次
x\{m,\} 重復(fù)出現(xiàn)至少m次
x\{m,n\} 重復(fù)出現(xiàn)至少m次不超過n次
X? 匹配出現(xiàn)零次或一次的大寫字母 X
X+ 匹配一個(gè)或多個(gè)字母 X
(abc|def)+ 匹配一連串的(最少一個(gè)) abc 或 def;abc 和 def 將匹配
\d 匹配任意一位數(shù)字
\D 匹配任意單個(gè)非數(shù)字字符
\w 匹配任意單個(gè)字母數(shù)字字符,同義詞是 [:alnum:]
\s 匹配任意的空白符
\b 匹配單詞的開始或結(jié)束
[:alpha:] 代表所有字母不論大小寫
[:lower:] 表示小寫字母
[:upper:] 表示大寫字母
[:digit:] 表示數(shù)字字符
() 括號(hào)內(nèi)的字符為一組
##################################
基本流程結(jié)構(gòu)
if [ $a == $b ]
then
echo "等于"
else
echo "不等于"
fi
##################################
case $xs in
0) echo "0" ;;
1) echo "1" ;;
*) echo "其他" ;;
esac
##################################
num=1
# while true 等同 while :
while [ $num -lt 10 ]
do
echo $num
((num=$num+2))
done
##################################
grep a a.txt | while read a
do
echo $a
done
##################################
w=`awk -F ":" '{print $1}' c`
for d in $w
do
$d
done
##################################
for ((i=0;i<${#o[*]};i++))
do
echo ${o[$i]}
done
##################################
until循環(huán)# 當(dāng)command不為0時(shí)
until command
do
body
done
##################################
流程控制
break N # 跳出幾層循環(huán)
continue N # 跳出幾層循環(huán),循環(huán)次數(shù)不變
continue # 重新循環(huán)次數(shù)不變
##################################
變量
將 變量A 賦值為字串
A="a b c def"
A=`命令`
間接調(diào)用
eval a=\$$a
將 變量A 定義為組數(shù)
A=(a b c def)
set a1 a2 a3 a4
$1 $2 $*
在子shell中運(yùn)行
(a=bbk)
定義變量類型
declare或者typeset
-r 只讀(readonly一樣)
-i 整形
-a 數(shù)組
-f 函數(shù)
-x export
declare -i n=0
env # 查看環(huán)境變量
env | grep "name" # 查看定義的環(huán)境變量
set # 查看環(huán)境變量和本地變量
read name # 輸入變量
readonly name # 把name這個(gè)變量設(shè)置為只讀變量,不允許再次設(shè)置
readonly # 查看系統(tǒng)存在的只讀文件
export name # 變量name由本地升為環(huán)境
export name="RedHat" # 直接定義name為環(huán)境變量
export Stat$nu=2222 # 變量引用變量賦值
unset name # 變量清除
export -n name # 去掉只讀變量
shift # 用于移動(dòng)位置變量,調(diào)整位置變量,使$3的值賦給$2.$2的值賦予$1
name + 0 # 將字符串轉(zhuǎn)換為數(shù)字
number " " # 將數(shù)字轉(zhuǎn)換成字符串
常用系統(tǒng)變量
$0 # 腳本啟動(dòng)名(包括路徑)
basename $0 # 只取腳本名
$n # 當(dāng)前程式的第n個(gè)參數(shù),n=1,2,…9
$* # 當(dāng)前程式的所有參數(shù)(不包括腳本本身)
$# # 當(dāng)前程式的參數(shù)個(gè)數(shù)(不包括腳本本身)
$$ # 當(dāng)前程式的PID
$! # 執(zhí)行上一個(gè)指令的PID
$? # 執(zhí)行上一個(gè)指令的返回值
變量引用技巧 ${}
${name:+value} # 如果設(shè)置了name,就把value顯示,未設(shè)置則為空
${name:-value} # 如果設(shè)置了name,就顯示它,未設(shè)置就顯示value
${name:?value} # 未設(shè)置提示用戶錯(cuò)誤信息value
${name:=value} # 如未設(shè)置就把value設(shè)置并顯示<寫入本地中>,
${#A} # 可得到變量中字節(jié)
${#A[*]} # 數(shù)組個(gè)數(shù)
${A[2]} # 腳本的一個(gè)參數(shù)
${A:4:9} # 取變量中第4位到后面9位
${A/www/http} # 取變量并且替換每行第一個(gè)關(guān)鍵字
${A//www/http} # 取變量并且全部替換每行關(guān)鍵字
定義了一個(gè)變量為:
file=/dir1/dir2/dir3/my.file.txt
${file#*/} # 去掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/} # 去掉最后一條 / 及其左邊的字串:my.file.txt
${file#*.} # 去掉第一個(gè) . 及其左邊的字串:file.txt
${file##*.} # 去掉最后一個(gè) . 及其左邊的字串:txt
${file%/*} # 去掉最后條 / 及其右邊的字串:/dir1/dir2/dir3
${file%%/*} # 去掉第一條 / 及其右邊的字串:(空值)
${file%.*} # 去掉最后一個(gè) . 及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*} # 去掉第一個(gè) . 及其右邊的字串:/dir1/dir2/dir3/my
# # 是去掉左邊(在鍵盤上 # 在 $ 之左邊)
# % 是去掉右邊(在鍵盤上 % 在 $ 之右邊)
# 單一符號(hào)是最小匹配﹔兩個(gè)符號(hào)是最大匹配
##################################
test條件判斷
# 符號(hào) [ ] 等同 test
expression為字符串操作
-n str # 字符串str是否不為空
-z str # 字符串str是否為空
expression為文件操作
-b # 是否塊文件
-p # 文件是否為一個(gè)命名管道
-c # 是否字符文件
-r # 文件是否可讀
-d # 是否一個(gè)目錄
-s # 文件的長(zhǎng)度是否不為零
-e # 文件是否存在
-S # 是否為套接字文件
-f # 是否普通文件
-x # 文件是否可執(zhí)行,則為真
-g # 是否設(shè)置了文件的 SGID 位
-u # 是否設(shè)置了文件的 SUID 位
-G # 文件是否存在且歸該組所有
-w # 文件是否可寫,則為真
-k # 文件是否設(shè)置了的粘貼位
-t fd # fd 是否是個(gè)和終端相連的打開的文件描述符(fd 默認(rèn)為 1)
-O # 文件是否存在且歸該用戶所有
! # 取反
expression為整數(shù)操作
expr1 -a expr2 # 如果 expr1 和 expr2 評(píng)估為真,則為真
expr1 -o expr2 # 如果 expr1 或 expr2 評(píng)估為真,則為真
兩值比較
整數(shù) 字符串
-lt <: # 小于
-gt >: # 大于
-le <=: # 小于或等于
-ge >=: # 大于或等于
-eq ==: # 等不等
-ne !=: # 不等于
判斷大小,0為真,1為假
test 10 -lt 5
echo $?
1
判斷字符串長(zhǎng)度是否為0
test -n "hello"
0
##################################
重定向
# 標(biāo)準(zhǔn)輸出 stdout 和 標(biāo)準(zhǔn)錯(cuò)誤 stderr 標(biāo)準(zhǔn)輸入stdin
cmd 1> fiel # 把 標(biāo)準(zhǔn)輸出 重定向到 file 文件中
cmd > file 2>&1 # 把 標(biāo)準(zhǔn)輸出 和 標(biāo)準(zhǔn)錯(cuò)誤 一起重定向到 file 文件中
cmd 2> file # 把 標(biāo)準(zhǔn)錯(cuò)誤 重定向到 file 文件中
cmd 2>> file # 把 標(biāo)準(zhǔn)錯(cuò)誤 重定向到 file 文件中(追加)
cmd >> file 2>&1 # 把 標(biāo)準(zhǔn)輸出 和 標(biāo)準(zhǔn)錯(cuò)誤 一起重定向到 file 文件中(追加)
cmd < file >file2 # cmd 命令以 file 文件作為 stdin(標(biāo)準(zhǔn)輸入),以 file2 文件作為 標(biāo)準(zhǔn)輸出
cat <>file # 以讀寫的方式打開 file
cmd < file cmd # 命令以 file 文件作為 stdin
cmd << delimiter
cmd; #從 stdin 中讀入,直至遇到 delimiter 分界符。
delimiter
>&n # 使用系統(tǒng)調(diào)用 dup (2) 復(fù)制文件描述符 n 并把結(jié)果用作標(biāo)準(zhǔn)輸出
<&n # 標(biāo)準(zhǔn)輸入復(fù)制自文件描述符 n
<&- # 關(guān)閉標(biāo)準(zhǔn)輸入(鍵盤)
>&- # 關(guān)閉標(biāo)準(zhǔn)輸出
n<&- # 表示將 n 號(hào)輸入關(guān)閉
n>&- # 表示將 n 號(hào)輸出關(guān)閉
##################################
運(yùn)算符
$[]等同于$(()) # $[]表示形式告訴shell求中括號(hào)中的表達(dá)式的值
~var # 按位取反運(yùn)算符,把var中所有的二進(jìn)制為1的變?yōu)?,為0的變?yōu)?
var\<<str # 左移運(yùn)算符,把var中的二進(jìn)制位向左移動(dòng)str位,忽略最左端移出的各位,最右端的各位上補(bǔ)上0值,每做一次按位左移就有var乘2
var>>str # 右移運(yùn)算符,把var中所有的二進(jìn)制位向右移動(dòng)str位,忽略最右移出的各位,最左的各位上補(bǔ)0,每次做一次右移就有實(shí)現(xiàn)var除以2
var&str # 與比較運(yùn)算符,var和str對(duì)應(yīng)位,對(duì)于每個(gè)二進(jìn)制來說,如果二都為1,結(jié)果為1.否則為0
var^str # 異或運(yùn)算符,比較var和str對(duì)應(yīng)位,對(duì)于二進(jìn)制來說如果二者互補(bǔ),結(jié)果為1,否則為0
var|str # 或運(yùn)算符,比較var和str的對(duì)應(yīng)位,對(duì)于每個(gè)二進(jìn)制來說,如二都該位有一個(gè)1或都是1,結(jié)果為1,否則為0
運(yùn)算符的優(yōu)先級(jí)
級(jí)別 運(yùn)算符 說明
1 =,+=,-=,/=,%=,*=,&=,^=,|=,<<=,>>== # 賦值運(yùn)算符
2 || # 邏輯或 前面不成功執(zhí)行
3 && # 邏輯與 前面成功后執(zhí)行
4 | # 按位或
5 ^ # 按異位與
6 & # 按位與
7 ==,!= # 等于/不等于
8 <=,>=,<,> # 大于或等于/小于或等于/大于/小于
9 \<<,>> # 按位左移/按位右移 (無轉(zhuǎn)意符號(hào))
10 +,- # 加減
11 *,/,% # 乘,除,取余
12 ! ,~ # 邏輯非,按位取反或補(bǔ)碼
13 -,+ # 正負(fù)
##################################
數(shù)學(xué)運(yùn)算
$(( )) 整數(shù)運(yùn)算符號(hào)大致有這些:
+ - * / **:分別為 "加、減、乘、除、密運(yùn)算"
& | ^ !:分別為 "AND、OR、XOR、NOT" 運(yùn)算
% :余數(shù)運(yùn)算
運(yùn)算
let
let x=16/4
let x=5**5
手工命令行計(jì)數(shù)器
expr
SUM=`expr 2 \* 3`
計(jì)算字串長(zhǎng)度
expr length "bkeep zbb"
抓取字串
expr substr "bkeep zbb" 4 9
抓取第一個(gè)字符數(shù)字串出現(xiàn)的位置
expr index "bkeep zbb" e
整數(shù)運(yùn)算
expr 14 % 9
expr 30 / 3 / 2 # 運(yùn)算符號(hào)有空格
增量計(jì)數(shù)(加循環(huán)即可)
LOOP=0
LOOP=`expr $LOOP + 1`
數(shù)值測(cè)試(如果試圖計(jì)算非整數(shù),則會(huì)返回錯(cuò)誤。)
rr=3.4
expr $rr + 1
expr: non-numeric argument
rr=5
expr $rr + 1
6
模式匹配(可以使用expr通過指定冒號(hào)選項(xiàng)計(jì)算字符串中字符數(shù))
.* 意即任何字符重復(fù)0次或多次
expr bkeep.doc : '.*'
在expr中可以使用字符串匹配操作,這里使用模式抽取.doc文件附屬名。
expr bkeep.doc : '\(.*\).doc'
次方計(jì)算
echo "m^n"|bc
##################################
grep用法
-c 顯示匹配到得行的數(shù)目,不顯示內(nèi)容
-h 不顯示文件名
-i 忽略大小寫
-l 只列出匹配行所在文件的文件名
-n 在每一行中加上相對(duì)行號(hào)
-s 無聲操作只顯示報(bào)錯(cuò),檢查退出狀態(tài)
-v 反向查找
-e 使用正則表達(dá)式
-A3 打印匹配行和下三行
-w 精確匹配
-wc 精確匹配次數(shù)
grep可用于if判斷,找到$?為then
過濾關(guān)鍵字符行
grep -v "a" txt
精確匹配字符串
grep -w 'a\>' txt
大小寫敏感
grep -i "a" txt
同時(shí)匹配大小寫
grep "a[bB]" txt
查找0-9重復(fù)三次的所在行
grep '[0-9]\{3\}' txt
任意條件匹配
grep -E "word1|word2|word3" file
同時(shí)匹配三個(gè)
grep word1 file | grep word2 |grep word3
##################################
tr用法
-c 用字符串1中字符集的補(bǔ)集替換此字符集,要求字符集為ASCII。
-d 刪除字符串1中所有輸入字符。
-s 刪除所有重復(fù)出現(xiàn)字符序列,只保留第一個(gè);即將重復(fù)出現(xiàn)字符串壓縮為一個(gè)字符串。
[a-z] a-z內(nèi)的字符組成的字符串。
[A-Z] A-Z內(nèi)的字符組成的字符串。
[0-9] 數(shù)字串。
\octal 一個(gè)三位的八進(jìn)制數(shù),對(duì)應(yīng)有效的ASCII字符。
[O*n] 表示字符O重復(fù)出現(xiàn)指定次數(shù)n。因此[O*2]匹配OO的字符串。
tr中特定控制字符的不同表達(dá)方式
速記符含義八進(jìn)制方式
\a Ctrl-G 鈴聲\007
\b Ctrl-H 退格符\010
\f Ctrl-L 走行換頁\014
\n Ctrl-J 新行\(zhòng)012
\r Ctrl-M 回車\015
\t Ctrl-I tab鍵\011
\v Ctrl-X \030
將所有大寫轉(zhuǎn)換成小寫字母
tr A-Z a-z
將空格替換為換行
tr " " "\n"
刪除空行
tr -s "[\012]" < plan.txt
tr -s ["\n"] < plan.txt
刪除文件中的^M,并代之以換行
tr -s "[\015]" "[\n]" < file
tr -s "[\r]" "[\n]" < file
替換passwd文件中所有冒號(hào),代之以tab鍵
tr -s "[:]" "[\011]" < /etc/passwd
tr -s "[:]" "[\t]" < /etc/passwd
增加顯示路徑可讀性
echo $PATH | tr ":" "\n"
tr在vi內(nèi)使用,在tr前加處理行范圍和感嘆號(hào)('$'表示最后一行)
1,$!tr -d '\t'
Mac -> UNIX
tr "\r" "\n"<macfile > unixfile
UNIX -> Mac
tr "\n" "\r"<unixfile > macfile
DOS -> UNIX
Microsoft DOS/Windows 約定,文本的每行以回車字符(\r)并后跟換行符(\n)結(jié)束
tr -d "\r"<dosfile > unixfile
UNIX -> DOS:在這種情況下,需要用awk,因?yàn)閠r不能插入兩個(gè)字符來替換一個(gè)字符
awk '{ print $0"\r" }'<unixfile > dosfile
##################################
awk用法
\b 退格
\f 換頁
\n 換行
\r 回車
\t 制表符Tab
\c 代表任一其他字符
-F 改變FS值(分隔符)
~ 匹配
= 賦值
== 匹配
+= 疊加
[:alnum:] 字母數(shù)字字符
[:alpha:] 字母字符
[:cntrl:] 控制字符
[:digit:] 數(shù)字字符
[:graph:] 非空白字符(非空格、控制字符等)
[:lower:] 小寫字母
[:print:] 與[:graph:]相似,但是包含空格字符
[:punct:] 標(biāo)點(diǎn)字符
[:space:] 所有的空白字符(換行符、空格、制表符)
[:upper:] 大寫字母
[:xdigit:] 十六進(jìn)制的數(shù)字(0-9a-fA-F)
內(nèi)建變量
$n 當(dāng)前記錄的第 n 個(gè)字段,字段間由 FS 分隔
$0 完整的輸入記錄
ARGC 命令行參數(shù)的數(shù)目
ARGIND 命令行中當(dāng)前文件的位置 ( 從 0 開始算 )
ARGV 包含命令行參數(shù)的數(shù)組
CONVFMT 數(shù)字轉(zhuǎn)換格式 ( 默認(rèn)值為 %.6g)
ENVIRON 環(huán)境變量關(guān)聯(lián)數(shù)組
ERRNO 最后一個(gè)系統(tǒng)錯(cuò)誤的描述
FIELDWIDTHS 字段寬度列表 ( 用空格鍵分隔 )
FILENAME 當(dāng)前文件名
FNR 同 NR ,但相對(duì)于當(dāng)前文件
FS 字段分隔符 ( 默認(rèn)是任何空格 )
IGNORECASE 如果為真(即非 0 值),則進(jìn)行忽略大小寫的匹配
NF 當(dāng)前記錄中的字段數(shù)(列)
NR 當(dāng)前行數(shù)
OFMT 數(shù)字的輸出格式 ( 默認(rèn)值是 %.6g)
OFS 輸出字段分隔符 ( 默認(rèn)值是一個(gè)空格 )
ORS 輸出記錄分隔符 ( 默認(rèn)值是一個(gè)換行符 )
RLENGTH 由 match 函數(shù)所匹配的字符串的長(zhǎng)度
RS 記錄分隔符 ( 默認(rèn)是一個(gè)換行符 )
RSTART 由 match 函數(shù)所匹配的字符串的第一個(gè)位置
SUBSEP 數(shù)組下標(biāo)分隔符 ( 默認(rèn)值是 /034) 。
BEGIN 先處理(可不加文件參數(shù))
END 結(jié)束時(shí)處理
[[:digit:][:lower:]] 數(shù)字和小寫字母(占一個(gè)字符)
-F"[ ]+|[%]+" 已多個(gè)空格或多個(gè)%為分隔符
[a-z]+ 多個(gè)小寫字母
[a-Z] 代表所有大小寫字母(aAbB...zZ)
[a-z] 代表所有大小寫字母(ab...z)
打印匹配到得行
awk '/Tom/' 文件
如果第三個(gè)字段值小于4000才打印
awk '$3 <4000' 文件
匹配Tom開頭的行 打印第一個(gè)字段
awk '/^Tom/{print $1}'
顯示所有第一個(gè)字段不是以ly結(jié)尾的行
awk '$1 !~ /ly$/' 文件
條件判斷(如果$1大于$2,max值為為$1,否則為$2)
awk '{max=($1 > $2) ? $1 : $2; print max}' 文件
awk '{print ($1>$2)?"第一排"$1:"第二排"$2}' e.txt
(括號(hào)代表if語句判斷 "?"代表then ":"代表else)
算術(shù)運(yùn)算(第三個(gè)字段和第四個(gè)字段乘積大于500則顯示)
awk '$3 * $4 > 500' 文件
打印tom到suz之間的行
awk '/tom/,/suz/' 文件
去掉前三行
awk '{$1="";$2="";$3="";print}' a.sh
將date值賦給d,并將d設(shè)置為數(shù)組mon,打印mon數(shù)組中第2個(gè)元素
awk 'BEGIN{ "date" | getline d; split(d,mon) ; print mon[2]}' 文件
以空格、:、制表符Tab為分隔符
awk -F'[ :\t]' '{print $1,$2}'
取關(guān)鍵字下第幾行
awk '/關(guān)鍵字/{a=NR+2}a==NR {print}'
awk中引用變量
a=22aa &&echo 88:99:44|awk -F":" '{print $1,"'"$a"'",$2,$3}'
指定類型(%d數(shù)字,%s字符)
/sbin/ifconfig |awk '{printf("line %d,%s\n",NR,$0)}'
awk -v RS=# 'NF{for(i=1;i<=NF;i++)if($i) printf $i;print ""}' 文件
awk加if判斷
awk '{if ( $6 > 50) print $1 " Too high" ;\
else print "Range is OK"}' file
awk '{if ( $6 > 50) { count++;print $3 } \
else { x+5; print $2 } }' file
awk加循環(huán)
awk '{i = 1; while ( i <= NF ) { print NF, $i ; i++ } }' file
awk '{ for ( i = 1; i <= NF; i++ ) print NF,$i }' file
提取時(shí)間,空格不固定
ll | awk -F'[ ]+|[ ][ ]+' '/^$/{print $8}'
查看磁盤空間
df|awk -F"[ ]+|%" '$5>14{print $5}'
取出第四列等于90的第五列
awk '$4==90{print $5}'
打印所有以模式no或so開頭的行
awk '/^(no|so)/' test
排列打印
awk 'END{printf "%-10s%-10s\n%-10s%-10s\n%-10s%-10s\n","server","name","123","12345","234","1234"}' txt
awk 'BEGIN{printf "|%-10s|%-10s|\n|%-10s|%-10s|\n|%-10s|%-10s|\n","server","name","123","12345","234","1234"}'
awk 'BEGIN{
print " *** 開 始 *** ";
print "+-----------------+";
printf "|%-5s|%-5s|%-5s|\n","id","name","ip";
}
$1!=1 && NF==4{printf "|%-5s|%-5s|%-5s|\n",$1,$2,$3" "$11}
END{
print "+-----------------+";
print " *** 結(jié) 束 *** "
}' txt
awk中計(jì)算(求余數(shù))
echo list|awk '{ i=($1%100);if ( $i >= 0 ) {print $0,$i}}'
sub匹配第一次出現(xiàn)的符合模式的字符串,相當(dāng)于 sed 's//'
awk '{sub(/Mac/,"Macintosh");print}' urfile
#用Macintosh替換Mac
gsub匹配所有的符合模式的字符串,相當(dāng)于 sed 's//g'
awk '{sub(/Mac/,"MacIntosh",$1); print}' file
#第一個(gè)域內(nèi)用Macintosh替換Mac
處理sql語句
cat 1.txt|awk -F" # " '{print "insert into user (user,password,email)values(""'\''"$1"'\'\,'""'\''"$2"'\'\,'""'\''"$3"'\'\)\;'"}' >>insert_1.txt
引用外部變量
awk '{print "'"$a"'","'"$b"'"}'
在END塊里面把數(shù)組內(nèi)容寫到文件
awk -F: '{name[x++]=$1};END{for(i=0;i<NR;i++)print i,name[i]}' data >tmp
將$1的值疊加后賦給sum
awk 'sum+=$1{print sum}' <<EOF
1 11 111
2 22 222
8 33 333
10 44 444
EOF
加入END只打印最后的結(jié)果
awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}' <<EOF
1324236000: 4.8726625090e+06 1.4806911317e+07
1324236300: 3.1952608823e+05 1.3144868085e+07
1324236600: 5.0792587262e+05 1.4931600767e+07
EOF
#結(jié)果中第一個(gè)值是$2的總和 第二個(gè)值是$3的總和 第三個(gè)值是$2總和除個(gè)數(shù)(平均值) 第四個(gè)值是$3總和除個(gè)數(shù)(平均值)
#e+06 是科學(xué)計(jì)數(shù)法,表示乘以10的6次方
awk '{sum2+=$2;count=count+1}END{print sum2,sum2/count}' <<EOF
1: 3 30
2: 6 60
3: 9 90
EOF
列求和
cat txt |awk '{a+=$1}END{print a}'
列求平均值
cat txt |awk '{a+=$1}END{print a/NR}'
列求最大值
cat txt |awk 'BEGIN{a=0}{if ($1>a) a=$1 fi}END{print a}'
#設(shè)定一個(gè)變量開始為0,遇到比該數(shù)大的值,就賦值給該變量,直到結(jié)束
求最小值
cat txt |awk 'BEGIN{a=11111}{if ($1<a) a=$1 fi}END{print a}'
判斷$1是否整除(awk中定義變量引用時(shí)不能帶 $ )
cat txt |awk '{ i=$1%10;if ( i == 0 ) {print i}}'
##################################
sed用法
-n 輸出由編輯指令控制(取消默認(rèn)的輸出,必須與編輯指令一起配合)
-i 直接對(duì)文件操作
-e 多重編輯 #修改文件先加 -i
p 打印
d 刪除
s 替換
g 配合s全部替換
i 行前插入
a 行后插入
r 讀
y 轉(zhuǎn)換
q 退出
\(..\) 保存..作為標(biāo)簽1(\1)
& 代表查找的串內(nèi)容
* 前導(dǎo)符
$ 最后一行
.* 匹配任意多個(gè)字符
模式空間(兩行兩行處理)
N 將第二行追加到第一行 將換行符\n替換空極為一行
n 將第二行覆蓋到第一行
h 把模式空間里的行拷貝到暫存空間
H 把模式空間里的行追加到暫存空間
g 用暫存空間的內(nèi)容替換模式空間的行
G 把暫存空間的內(nèi)容追加到模式空間的行后
x 將暫存空間的內(nèi)容于模式空間里的當(dāng)前行互換
! 對(duì)所選行以外的所有行應(yīng)用命令。
注意:暫存空間里默認(rèn)存儲(chǔ)一個(gè)空行。
sed命令替換并打印出替換行( -i改變文本)
sed -n -e "{s/文本(正則表達(dá)式)/替換的文本/p}"
打印并刪除正則表達(dá)式的那部分內(nèi)容
sed -n -e "{s/^ *[0-9]*//p}"
刪除匹配行
sed -i "/^$f/d" a
刪除匹配行到末尾
sed -i '/ppppppppppp/,$d' incl
直接對(duì)文本替換
sed -i "s/=/:/" c
找到pearls開頭在行尾加j
sed -i "/^pearls/s/$/j/" ab.txt
標(biāo)簽(保存\(mar\)作為標(biāo)簽1)
sed -n 's/\(mar\)got/\1ianne/p' 文件
echo "margot"|sed -n 's/\(mar\).*\(t\)/\1\2/p'
sed -e 's/^\([a-zA-Z]\+\) \([a-zA-Z]\+\)\(.*\)/\2 \1\3/g' file
在以[0-9][0-9]結(jié)尾的行后加5
sed 's/[0-9][0-9]$/&5' 文件
打印從第5行到以no開頭行之間的所有行
sed -n '5,/^no/p' 文件
修改west和east之間的所有行,在結(jié)尾處加*VACA*
sed '/west/,/east/s/$/*VACA*/' 文件
多重編輯(先刪除1-3行,在將1替換成2)
sed -i -e '1,3d' -e 's/1/2/' 文件
找到含suan的行,在后面加上讀入的文件內(nèi)容
sed '/suan/r 讀入文件' 文件
找到含no的行,寫入到指定文件中
sed -n '/no/w 寫入文件' 文件
取出第一組數(shù)字,并且忽略掉開頭的0
sed 's/[^1-9]*\([0-9]\+\).*/\1/'
打印1和3之間的行
sed '/1/,/3/p' file
取出指定行
sed -n '1p' 文件
在第5行之前插入行
sed '5i\aaa' file
在第5行之后抽入行
sed '5a\aaa' file
在匹配行前插入一行
echo a|sed -e '/a/i\b'
在匹配行后插入一行
echo a|sed -e '/a/a\b'
echo a|sed 's/a/&\nb/g'
引用外部變量
sed -n ''$a',10p'
sed -n ""$a",10p"
取用戶家目錄(匹配不為/的字符和匹配:到結(jié)尾的字符全部刪除)
sed -n '{s/^[^\/]*//;s/\:.*//;p}' /etc/passwd
將換行符轉(zhuǎn)換為換行
echo abcd\\nabcde |sed 's/\\n/@/g' |tr '@' '\n'
刪除掉@后面所有字符,和空行
sed -e 's/@.*//g' -e '/^$/d'
將幾行合并成一行
echo $(cat file)|sed 's/ //g'
取一列最大值
cat tmp|awk '{print $1}'|sort -n|sed -n '$p'
查找屬主權(quán)限為7的文件
ls -l|sed -n '/^.rwx.*/p'
在a前面加#號(hào)
echo a|sed -e 's/a/#&/g'
##################################
圖形dialog
多選界面[方括號(hào)]
dialog --title "Check me" --checklist "Pick Numbers" 15 25 3 1 "one" "off" 2 "two" "on" 3 "three" "off" 2>tmp
多選界面(圓括號(hào))
dialog --title "title" --radiolist "checklist" 20 60 14 tag1 "item1" on tag2 "item2" off 2>tmp
單選界面
dialog --title "title" --menu "MENU" 20 60 14 tag1 "item1" tag2 "item2" 2>tmp
進(jìn)度條
dialog --title "Installation" --backtitle "Star Linux" --gauge "Linux Kernel" 10 60 50
選擇yes/no
dialog --title "標(biāo)題" --backtitle "Dialog" --yesno "說明" 20 60
公告
dialog --title "公告標(biāo)題" --backtitle "Dialog" --msgbox "內(nèi)容" 20 60
顯示訊息后立即離開
dialog --title "hey" --backtitle "Dialog" --infobox "Is everything okay?" 10 60
輸入對(duì)話框
dialog --title "hey" --backtitle "Dialog" --inputbox "Is okay?" 10 60 "yes"
顯示文檔內(nèi)容
dialog --title "Array 30" --backtitle "All " --textbox /root/txt 20 75
多條輸入對(duì)話框
dialog --title "Add a user" --form "Add a user" 12 40 4 "Username:" 1 1 "" 1 15 15 0 "Full name:" 2 1 "" 2 15 15 0 2>tmp
星號(hào)顯示輸入--insecure
dialog --title "Password" --insecure --passwordbox "請(qǐng)輸入密碼" 10 35
選擇日期
dialog --stdout --title "日歷" --calendar "請(qǐng)選擇" 0 0 9 1 2010
##################################
腳本頭 # sh為當(dāng)前系統(tǒng)默認(rèn)shell,可指定為bash等
#!/bin/sh
臨時(shí)文件定義
errtmp=/tmp/$$`date +%s%N`.errtmp
outtmp=/tmp/$$`date +%s%N`.outtmp
true > $outtmp
隨機(jī)數(shù)
$RANDOM
進(jìn)程號(hào)
$$
納秒
date +%N
在當(dāng)前bash環(huán)境下讀取并執(zhí)行FileName中的命令
source file-name # 等同 . FileName
間隔睡眠5秒
sleep 5
在接收到信號(hào)后將要采取的行動(dòng)
trap
當(dāng)前目錄
$PWD
之前一個(gè)目錄的路徑
$OLDPWD
返回上一個(gè)目錄路徑
cd -
重復(fù)打印
yes
自動(dòng)回答y或者其他
yes |rm -i *
查看目錄所有文件夾
ls -p /home
查看匹配完整路徑
ls -d /home/
命令替換xargs
#將前面的內(nèi)容,作為后面命令的參數(shù)
find / -perm +7000 | xargs ls -l
不換行執(zhí)行下一句話
echo -n aa;echo bb
使轉(zhuǎn)義生效
echo -e "s\tss\n\n\n"
取字符串中字元
echo $a | cut -c2-6
排列組合(括號(hào)內(nèi)一個(gè)元素分別和其他括號(hào)內(nèi)元素組合)
echo {a,b,c}{a,b,c}{a,b,c}
返回目錄名
pwd | awk -F/ '{ print "目錄名:" ,$2 }'
倒置讀取文件 # 刪除最后3行
tac file |sed 1,3d|tac
替換上一條命令中的(foo)一個(gè)短語(bar)
^foo^bar^
!!:s/foo/bar/
!!:gs/foo/bar
##################################
shell例子
判斷參數(shù)是否為空-空退出并打印null
#!/bin/sh
echo $1
name=${1:?"null"}
echo $name
##################################
循環(huán)數(shù)組
for ((i=0;i<${#o[*]};i++))
do
echo ${o[$i]}
done
##################################
判斷路徑
if [ -d /root/Desktop/text/123 ];then
echo "找到了123"
if [ -d /root/Desktop/text ]
then echo "找到了text"
else echo "沒找到text"
fi
else echo "沒找到123文件夾"
fi
##################################
匹配替換密碼
#!/bin/sh
cat mailpassword > temp.txt
sed -i "s/:/ = /" temp.txt
w=`awk -F " = " '{print $1}' temp.txt`
for d in $w
do
grep -w $d svnpassword >/dev/null
if [ $? -eq 0 ]
then
sed -i "/^$d/d" svnpassword
grep "^$d" temp.txt >> svnpassword
#替換到轉(zhuǎn)義就出問題
#sed -i "/^$d/c $(grep "^$d" temp.txt)" svnpassword
fi
done
rm temp.txt
##################################
多行合并
將兩行并為一行(去掉換行符)
sed '{N;s/\n//}' file
將4行合并為一行(可擴(kuò)展)
awk '{if (NR%4==0){print $0} else {printf"%s ",$0}}' file
將所有行合并
awk '{printf"%s ",$0}'
##################################
shift用法
./cs.sh 1 2 3
#!/bin/sh
until [ $# -eq 0 ]
do
echo "第一個(gè)參數(shù)為: $1 參數(shù)個(gè)數(shù)為: $#"
#shift 命令執(zhí)行前變量 $1 的值在shift命令執(zhí)行后不可用
shift
done
##################################
給腳本加參數(shù)getopts
#!/bin/sh
while getopts :ab: name
do
case $name in
a) aflag=1
;;
b) bflag=1
bval=$OPTARG
;;
\?) echo "USAGE:`basename $0` [-a] [-b value]"
exit 1
;;
esac
done
if [ ! -z $aflag ] ; then
echo "option -a specified"
echo "$aflag"
echo "$OPTIND"
fi
if [ ! -z $bflag ] ; then
echo "option -b specified"
echo "$bflag"
echo "$bval"
echo "$OPTIND"
fi
echo "here $OPTIND"
shift $(($OPTIND -1))
echo "$OPTIND"
echo " `shift $(($OPTIND -1))` "
##################################
判斷腳本參數(shù)是否正確
./test.sh -p 123 -P 3306 -h 127.0.0.1 -u root
#!/bin/sh
if [ $# -ne 8 ];then
echo "USAGE: $0 -u user -p passwd -P port -h host"
exit 1
fi
while getopts :u:p:P:h: name
do
case $name in
u)
mysql_user=$OPTARG
;;
p)
mysql_passwd=$OPTARG
;;
P)
mysql_port=$OPTARG
;;
h)
mysql_host=$OPTARG
;;
*)
echo "USAGE: $0 -u user -p passwd -P port -h host"
exit 1
;;
esac
done
if [ -z $mysql_user ] || [ -z $mysql_passwd ] || [ -z $mysql_port ] || [ -z $mysql_host ]
then
echo "USAGE: $0 -u user -p passwd -P port -h host"
exit 1
fi
echo $mysql_user $mysql_passwd $mysql_port $mysql_host
#結(jié)果 root 123 3306 127.0.0.1
##################################
dialog取值接值退出
outtmp=/tmp/outtmp
dialog --no-shadow --backtitle "雪松制作" --title "請(qǐng)選擇" --ok-label "提交" --cancel-label "取消" --menu "請(qǐng)選擇" 10 60 0 \
1 "[目錄]" \
q "[退出]" \
2> $outtmp
#判斷提交取消
if [ $? == "1" ]
then
break
#continue
fi
#只判斷退出
pt=`awk '{print}' $outtmp`
if [ $pt == q ]
then
break
fi
#判斷操作
case $pt in
1)
#操作
;;
q)
exit #break
;;
esac
##################################
dialog輸入對(duì)話框加判斷
while :
do
outtmp=/tmp/outtmp
dialog --title "雪松制作" --form "請(qǐng)輸入" 20 60 10 "用戶:" 1 2 "" 1 15 35 0 "ID:" 2 2 "" 2 15 35 0 "" 6 2 "" 6 0 0 0 "輸入格式如下" 7 2 "" 7 0 0 0 "說明" 8 2 "" 8 0 0 0 2> $outtmp
yh=`sed -n '1p' $outtmp`
id=`sed -n '2p' $outtmp`
if echo $yh | grep -e '^[1-9][0-9]\{0,2\}' > /dev/null 2>&1
then
if echo $id | grep -e '^[1-9][0-9]\{0,12\}' > /dev/null 2>&1
then
break
else
echo "您輸入的不合法,請(qǐng)從新輸入!"
fi
else
echo "您輸入的不合法,請(qǐng)從新輸入!"
fi
done
##################################
打印表格
#!/bin/sh
clear
awk 'BEGIN{
print "+--------------------+--------------------+";
printf "|%-20s|%-20s|\n","Name","Number";
print "+--------------------+--------------------+";
}'
a=`grep "^[A-Z]" a.txt |sort +1 -n |awk '{print $1":"$2}'`
#cat a.txt |sort +1 -n |while read list
for list in $a
do
name=`echo $list |awk -F: '{print $1}'`
number=`echo $list |awk -F: '{print $2}'`
awk 'BEGIN{printf "|%-20s|%-20s|\n","'"$name"'","'"$number"'";
print "+--------------------+--------------------+";
}'
done
awk 'BEGIN{
print " *** The End *** "
print " "
}'
##################################
判斷日期是否合法
#!/bin/sh
while read a
do
if echo $a | grep -q "-" && date -d $a +%Y%m%d > /dev/null 2>&1
then
if echo $a | grep -e '^[0-9]\{4\}-[01][0-9]-[0-3][0-9]$'
then
break
else
echo "您輸入的日期不合法,請(qǐng)從新輸入!"
fi
else
echo "您輸入的日期不合法,請(qǐng)從新輸入!"
fi
done
echo "日期為$a"
##################################
打印日期段所有日期
#!/bin/bash
qsrq=20010101
jsrq=20010227
n=0
>tmp
while :;do
current=$(date +%Y%m%d -d"$n day $qsrq")
if [[ $current == $jsrq ]];then
echo $current >>tmp;break
else
echo $current >>tmp
((n++))
fi
done
rq=`awk 'NR==1{print}' tmp`
##################################
打印提示
cat <<EOF
#內(nèi)容
EOF
登陸遠(yuǎn)程執(zhí)行命令(特殊符號(hào)需要\轉(zhuǎn)義)
ssh root@ip << EOF
#執(zhí)行命令
EOF
登陸mysql執(zhí)行命令
mysql -uroot -ppasswd -S mysql.sock --default-character-set=gbk -A<<EOF>outtmp
#mysql命令
EOF
##################################
數(shù)學(xué)計(jì)算的小算法
#!/bin/sh
A=1
B=1
while [ $A -le 10 ]
do
SUM=`expr $A \* $B`
echo "$SUM"
if [ $A = 10 ]
then
B=`expr $B + 1`
A=1
fi
A=`expr $A + 1`
done
##################################
豎行轉(zhuǎn)橫行(三種)
cat file|tr '\n' ' '
echo $(cat file)
#!/bin/sh
for i in `cat file`
do
a=${a}" "${i}
done
echo $a
##################################
取用戶的根目錄
#! /bin/bash
#showhome.sh
IFS=:
while read name pass uid gid gecos home shell
do
echo $home
done
執(zhí)行./showhome.sh < /etc/passwd
##################################
把漢字轉(zhuǎn)成encode格式:
echo 論壇 | tr -d "\n" | xxd -i | sed -e "s/ 0x/%/g" | tr -d " ,\n"
%c2%db%cc%b3
大寫的:
echo 論壇 | tr -d "\n" | xxd -i | sed -e "s/ 0x/%/g" | tr -d " ,\n" | tr "[a-f]" "[A-F]"
%C2%DB%CC%B3
##################################
把帶有大寫字母的文件名改為全部小寫
#!/bin/bash
for f in *;do
mv $f `echo $f |tr "[A-Z]" "[a-z]"`
done
##################################
查找連續(xù)多行,在不連續(xù)的行前插入
#/bin/bash
lastrow=null
i=0
cat incl|while read line
do
i=`expr $i + 1`
if echo "$lastrow" | grep "#include <[A-Z].h>"
then
if echo "$line" | grep -v "#include <[A-Z].h>"
then
sed -i ''$i'i\\/\/All header files are include' incl
i=`expr $i + 1`
fi
fi
lastrow="$line"
done
##################################
查詢數(shù)據(jù)庫其它引擎
#/bin/bash
path1=/data/mysql/data/
dbpasswd=db123
#MyISAM或InnoDB
engine=InnoDB
if [ -d $path1 ];then
dir=`ls -p $path1 |awk '/\/$/'|awk -F'/' '{print $1}'`
for db in $dir
do
number=`mysql -uroot -p$dbpasswd -A -S "$path1"mysql.sock -e "use ${db};show table status;" |grep -c $engine`
if [ $number -ne 0 ];then
echo "${db}"
fi
done
fi
##################################
批量修改數(shù)據(jù)庫引擎
#/bin/bash
for db in test test1 test3
do
tables=`mysql -uroot -pdb123 -A -S /data/mysql/data/mysql.sock -e "use $db;show tables;" |awk 'NR != 1{print}'`
for table in $tables
do
mysql -uroot -pdb123 -A -S /data/mysql/data/mysql.sock -e "use $db;alter table $table engine=MyISAM;"
done
done
##################################
聯(lián)系客服