1?shell 中的數(shù)組 可以是關(guān)聯(lián)數(shù)組,索引值不是數(shù)組 0 1 2 ?
創(chuàng)新互聯(lián)公司專(zhuān)注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于做網(wǎng)站、成都做網(wǎng)站、和順網(wǎng)絡(luò)推廣、小程序設(shè)計(jì)、和順網(wǎng)絡(luò)營(yíng)銷(xiāo)、和順企業(yè)策劃、和順品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供和順建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com
decalre -A ? f_value ? ? ? # 申明數(shù)組 ?可以省略?
f_value=([apple]='100doll' [orange]='150 doll') ? 定義數(shù)組?
echo ${f_value[apple]} ?# 去數(shù)組值?
例如:?
declare -A f_fruit ? ?# 一定要申明,不同于索引為 0 1 2 的可以不需要申明 ? # declare -a ?A ?這是定義 普通的數(shù)組
f_fruit=([apple]='100RMB' [orange]='50RMB')?
echo ${f_fruit[apple]}?
echo ${f_fruit[orange]}?
echo ${!f_fruit[*]}?
3??sh腳本調(diào)試 ???
全部調(diào)試 ?sh -x?
部分調(diào)試 ?只調(diào)試代碼中的類(lèi)容?
set -x
代碼
set +x
例子:?
?#!/bin/bash?
#?
for i in {1..6}?
do?
? ? ???? set -x?
? ? ? ? echo $i?
? ? ? ? set +x?
done?
echo "script executed"?
??
注: set -x 在執(zhí)行時(shí)顯示參數(shù)和命令?
? ? set +x 禁止調(diào)試上?
4?讀取read ,??不用enter 回車(chē)表示確定用特定的字符表示結(jié)束
read -d ":"?
例如;?
read -p "Please enter you name:"??-d ":"??NAME?
例如;?
read -p "Input you Name: " Name?
read -d ":" -p "Input you User: " User?
echo?
read -t 5 -s -p "Input you Password: " Password?
補(bǔ)充:?
-s 無(wú)回顯方式如密碼輸入?
-t ?超時(shí)設(shè)置?
5 運(yùn)行直到命令成功
repeat()?
? { while true ?: ; do??$@?&& return; sleep 30;done }?
執(zhí)行函數(shù) ?repeat wget -c http://download?
6 find 的基于depth 深度
find??-maxdepth 2?二級(jí) ??
-mindepth 最小的深度?
find /data/zhiliang.cui/scripts/ -mindepth 10 -name "*.sh" ?-print??
7??單向散列算法 md5sum
生成校驗(yàn)和
[??root@cui1?data]#?md5sum?/data/zhiliang.cui/scripts/sh/1.sh?/data/zhiliang.cui/scripts/sh/for.sh???
24edee6130b1e1c6e57708592f6d6fa9??/data/zhiliang.cui/scripts/sh/1.sh??
81eef2d13e3dfeabfe53e6a3ddf43156??/data/zhiliang.cui/scripts/sh/for.sh?
> 定向到文件 file_sum.md5 ??
-c?? 檢查校驗(yàn)和和文件校驗(yàn)和比較?
文件修改后的結(jié)果?
?--status ?不輸出任何東西,一般用于執(zhí)行返回碼的作用?
注:?
加密的其他算法:?
base64?
[??root@cui1?data]#?cat?file_sum.md5???
24edee6130b1e1c6e57708592f6d6fa9??/data/zhiliang.cui/scripts/sh/1.sh??
81eef2d13e3dfeabfe53e6a3ddf43156??/data/zhiliang.cui/scripts/sh/for.sh??
[??root@cui1?data]#???base64?file_sum.md5???
MjRlZGVlNjEzMGIxZTFjNmU1NzcwODU5MmY2ZDZmYTkgIC9kYXRhL3poaWxpYW5nLmN1aS9zY3Jp??
cHRzL3NoLzEuc2gKODFlZWYyZDEzZTNkZmVhYmZlNTNlNmEzZGRmNDMxNTYgIC9kYXRhL3poaWxp??
YW5nLmN1aS9zY3JpcHRzL3NoL2Zvci5zaAo=??
[??root@cui1?data]#?base64?file_sum.md5?>?base64??
[??root@cui1?data]#???base64?-d?base64 ? #解密??
24edee6130b1e1c6e57708592f6d6fa9??/data/zhiliang.cui/scripts/sh/1.sh??
81eef2d13e3dfeabfe53e6a3ddf43156??/data/zhiliang.cui/scripts/sh/for.sh?
gpg 加密?
gpg -c file 以交互式方式加密
解密??
gpg -d 以交互式方式解密
加salt的加密方法:??
openssl -1 -salt SALT_STRING PASSWORD
8 分隔文件?
以大小或者行數(shù)分隔 split
-b 以大小分隔 -b 10K ?以10K大小一個(gè)文件進(jìn)行分隔
-l 一行數(shù)切割
split -b 100K messages-20150212?
-a 指定【后綴】長(zhǎng)度 ?默認(rèn)為2 ??
-d 以數(shù)字作為分隔后的后綴?
默認(rèn)是字母為后綴?
前綴可以指定: split [OPTION] [INPUT [PREFIX]]?
例如:
[??root@cui1?test]#?split?-b?100K?-d?-a?4?messages-20150212?message??
[??root@cui1?test]#?ll??
總用量?760??
-rw-r--r--?1?root?root?102400?3月???3?00:21???message??0000 ? {message 為指定的前綴 ? 0000表示使用數(shù)組作為后綴}??
-rw-r--r--?1?root?root?102400?3月???3?00:21?message0001??
-rw-r--r--?1?root?root?102400?3月???3?00:21?message0002??
-rw-r--r--?1?root?root??78495?3月???3?00:21?message0003??
-rwxr-xr-x?1?root?root?385695?3月???3?00:21?messages-20150212?
注: 擴(kuò)展 ?csplit 是split變體工具,支持 以指定文件字符作為切割符?
9 利用并行進(jìn)程加速執(zhí)行腳本?
^C[??root@cui1?test]#?vim?sleep???
#!/bin/sh??
#??
pidarray=()??
for((i=1;i<=5;i++))??
do??
????sleep?10?&??
??????pidarray+=("$!")??
done??
wait?${pidarray[@]} ??
# wait ?等待所有的完成?
1 放到后臺(tái)運(yùn)行?
2 wait 等待所有進(jìn)程【號(hào)】結(jié)束才結(jié)束腳本?
10??回環(huán)文件
dd?
mkfs.ext4?
mount -o loop?
/dev/loop*?
10 統(tǒng)計(jì)字符個(gè)數(shù)?
[??root@cui1?sh]#?echo?123?|?wc?-c??
4??
[??root@cui1?sh]#?echo?-n?123?|?wc?-c??
3?
其實(shí)-n 只是表示避免添加??額外的換行符
11 wget下載
wget URL??
-O 指定下載保存的路徑/文件?
-o ?下載的log?
-t 指定重試的次數(shù)?
-t 0 無(wú)線次數(shù)?
12 純文本形式dump?
lynx URL -dump > file.txt?
Lynx 是一個(gè)字符界面下的全功能的WWW瀏覽器,支持很多操作系統(tǒng)??
lynx??-source???http://pim.qq.com? ? ?dump下網(wǎng)頁(yè)的source 源文件?
12??sftp ?模擬ftp格式進(jìn)入 一個(gè)交互式命令
服務(wù)器不需要 ?打開(kāi)ftp服務(wù),只要?
sftp?-oPort=22???root@192.168.7.235
13 lastb ?失敗登入獲取
14 watch 動(dòng)態(tài)觀察變化
wathc COMMAND?
默認(rèn)2秒?
-n SECOND 指定秒數(shù)?
-d ?顏色標(biāo)明變化的部分
15 fsck
fsck 會(huì)自動(dòng)檢測(cè)文件系統(tǒng)類(lèi)型 調(diào)用fsck.type ,但是檢測(cè)之前最后做個(gè)模擬,?
fsck -N ?進(jìn)行模擬,看結(jié)果在真正執(zhí)行,比如fsck可能會(huì)將某些扇區(qū)標(biāo)為壞的扇區(qū),但我們卻希望從中恢復(fù)數(shù)據(jù)?
-A??
? ? ? ?-A ? ? Walk ?through ?the /etc/fstab file?
fsck檢測(cè)時(shí)一定不能在掛載狀態(tài)
16 shell結(jié)合MySQL操作的方式
mysql -u $USER -p$PASS??<< EOF?2> /dev/null?
create table students(?
id int,?
name varchar(100),?
mark int?
);?
EOF
17 ping ?-c 個(gè)數(shù)?
注: 只要其中有一個(gè)值能夠ping通,其ech $? 返回值就是 ?0,如果所有都ping不通 則返回值為1 (不成功)
18 打印出文件中從第二行開(kāi)始的文件?
?tail -n +2
? ? ? -n, --lines=K?
? ? ? ? ? ? ? output the last K lines, instead of the last 10; or use -n +K to output lines starting with the Kth
sed?-n?'2,$p'
同義詞:?
? ? head -n -Kth?
? ???
19 ls 命令
ls -S ?可以以大小進(jìn)行排序,從大到小?
常用ls -lhS
ls -lhSr
ls -t 已修改的時(shí)間進(jìn)行排序?
常用ls -lt (從最新的文件到最舊的)
ls -ltr
ls -n 顯示uid 和 gid 而不是用戶名和用戶組
20 gzip?
用法?
gzip file?
默認(rèn) ?源文件被刪除 生成 ?file.gz?
如何 ?保存源文件且輸出壓縮文件呢 ?可以使用-c 選項(xiàng)original
-c ?Write output on standard output; keep original files unchanged.?
gzip -c file > file.gz?
聯(lián)想:?
cat file1 file2 file3 | gzip > file.gz?
gzip -l ?file.gz ?檢查文件的壓縮比?
gunzip = gzip -d?
gunzip -c file.gz ? 能夠保留原始文件
掛載磁盤(pán),用于修復(fù)作用?
guestmount -a vm112x113.img -m /dev/sda2 ?/mnt ??
21 找出當(dāng)前你在哪個(gè)shell中?
echo “$0” ?或者 ps -p $$ ?或者 ps $$
如何找出子的shell 在第幾層 ?可不可以退出 ctrl + D?
找出子shell的層級(jí)或臨時(shí)shell的嵌套層級(jí),每個(gè)bash實(shí)例啟動(dòng)后,變量??$SHLVL?的值都會(huì)加一?
如?
echo “$SHLVL”
結(jié)果為1
輸入 screen?
echo “$SHLVL”
結(jié)果為2
輸入 bash
echo “$SHLVL”
結(jié)果為3
22??lsof +D /usr/local/ 同上,但是會(huì)搜索目錄下的目錄,時(shí)間較長(zhǎng)?
23?find /data/ -name "*sum*" -type d
find /data -name “keyword” -type f 查找路徑下關(guān)鍵字為keyword的文件
23 eval?
一 e v a l命令將會(huì)首先掃描命令行進(jìn)行所有的置換,然后再執(zhí)行該命令。該命令適用于那些一次掃描無(wú)法實(shí)現(xiàn)其功能的變量。該命令對(duì)變量進(jìn)行兩次掃描。這些需要進(jìn)行兩次掃描的變量有時(shí)被稱為復(fù)雜變量。不過(guò)這些變量本身并不復(fù)雜。
echo "Last argument os "$(eval?echo \$$#)""
eval命令:將參數(shù)組合為一個(gè)新的命令,然后交給Shell執(zhí)行
eval可以讀取一連串的參數(shù),并依參數(shù)本身的內(nèi)容來(lái)執(zhí)行命令。常用來(lái)處理Shell腳本中的變量,參數(shù)不限數(shù)目,參數(shù)用分號(hào)“;”隔開(kāi),如果命令后面不帶參數(shù)或者參數(shù)為空,命令將返回0值。
Usage: eval [arg ...]
arg交給eval進(jìn)行組合的參數(shù)
例:
1、編輯一個(gè)shell,先定義一個(gè)變量并賦值ls命令,之后把這個(gè)變量傳遞給eval
#!/bin/bash
#定義變量
command="ls -l /home"
eval $command ??#訪問(wèn)變量前面加一個(gè)$符號(hào)。
2、把ls --color -l \作為參數(shù)傳遞給eval
linux@office:~$ eval 'ls --color -l \'
總計(jì) 72
-rwxrwxrwx ??1 linux linux ??106 2011-03-04 09:58 cmd
drwxr-xr-x ??2 linux linux 4096 2011-03-04 09:15 Desktop
drwxr-xr-x 14 linux linux 4096 2011-03-04 08:00 Documents
drwxr-xr-x ??4 linux linux 4096 2011-03-04 09:15 Downloads
-rw-r--r-- ??1 linux linux ??619 2011-03-04 09:42 echo
??
24 刪除本路徑下 除某個(gè)文件外的所有
rm -rf `ls | grep -v "tmux”`
25 cp(scp) 中的重要選項(xiàng)
-p ?preserver ?保留文件的原有權(quán)限和時(shí)間戳
-r/-R ?遞歸的拷貝目錄
-a ?等于-p -r -d
注: ?scp -r d1 d2 的結(jié)果是 ?d2/d1
scp -r d1/* d2 的結(jié)果 d2/*
26 kill 掉某個(gè)用戶, 強(qiáng)制這個(gè)用戶退出
1 w 查看哪些用戶登入
2 ps -ef | grep “pts/4”
3 kill 掉此用戶的sshd進(jìn)程即可
kill -9 17306
27 passwd -S ?查看密碼的最新更改時(shí)間,如果密碼重來(lái)沒(méi)有更改過(guò)可以判斷此賬戶的創(chuàng)建時(shí)間了
[root@cui1 zhiliang]# passwd -S zhiliang
zhiliang PS 2015-08-02 0 99999 7 -1 (密碼已設(shè)置,使用 SHA512 加密。)
28 多行變一行,如果有需要可以將多行實(shí)現(xiàn)成為一行
如果將由必要實(shí)現(xiàn) 兩個(gè)參數(shù)到一行中, 可以試用xargs -n2
-n??Use at most?max-args?arguments per??command??line
注: 當(dāng)然可以是用awk的多行處理技術(shù)實(shí)現(xiàn)(待研究)
29:awk -F ”正則表達(dá)式"
df -h | grep "/boot" | awk -F "[ ?\t%]+" '{print $5}’?
30?
head 和 tail 的高級(jí)用法:
head
? ? ? ?-n, --lines=[-]K
? ? ? ? ? ? ? print the first K lines instead of the first 10; with the leading ‘-’, print all but the last K
? ? ? ? ? ? ? lines of each file
如使用方法: head -n-2 ?(如果k前面有-號(hào),表示打印所有的,除了最后的2行)
tail
-n, --lines=K output the last K lines, instead of the last 10; or use -n +K to output lines starting with the Kth
如使用方法: tail -n+2 ? 就是輸出從第二行開(kāi)始的所有行
輸出從第二行開(kāi)始,也就是過(guò)濾到了第一行
31 如何查看一個(gè)文件的完整access modify(文件內(nèi)容被改變) change時(shí)間
ls -l filename 看到的只有月日 的modify時(shí)間
查看完整時(shí)間方法1 ?ls -l —full-time filename
stat filename
[root@cui1 zhiliang.cui]# ls -l --full-time trigge83_list
-rw-r--r-- 1 root root 232089 2015-08-09 06:21:40.388338770 -0400 trigge83_list
[root@cui1 zhiliang.cui]# stat trigge83_list?
? File: "trigge83_list"
? Size: 232089 ? ? ? ? ?Blocks: 456 ? ? ? ?IO Block: 4096 ? 普通文件
Device: fd00h/64768d ? ?Inode: 279504 ? ? ?Links: 1
Access: (0644/-rw-r--r--) ?Uid: ( ? ?0/ ? ?root) ? Gid: ( ? ?0/ ? ?root)
Access: 2015-08-09 06:20:26.695384447 -0400
Modify: 2015-08-09 06:21:40.388338770 -0400
Change: 2015-08-09 06:26:10.308193915 -0400
32 ftp客戶端的問(wèn)題
有原始的ftp yum install ftp 和 window上的 等,還有l(wèi)ftp yum install -y lftp
不同的命令可能支持的性不一樣
比如: ftp 上傳的時(shí)候 ? put localfile remotefile ? ?(其中remotefile 不能省略也就是說(shuō)只能重名名文件)
一般推薦使用lftp
用戶名:密碼@remotehost
lftp?ftp:?NGjZPR86KinJO69Vf@192.168.216.171
33 sh -c 的作用
-c string, shell方式 執(zhí)行后面string中的一系列命令
?sh -c 'cd /data/zhiliang.cui; touch testfiel'
34 sudo 可以讓你切換身份來(lái)進(jìn)行某項(xiàng)任務(wù),而不僅僅sudo 默認(rèn)到root用戶
sudo -u username 執(zhí)行命令
與
su - username 執(zhí)行命令
兩者的區(qū)別
前者是以某個(gè)用戶的身份去執(zhí)行,而su - 是切換到這個(gè)用戶去執(zhí)行命令,會(huì)先登入,在執(zhí)行命令,在執(zhí)行完成之后,會(huì)退出!
所以,要以某個(gè)身份去執(zhí)行命令,還是推薦sudo -u username,因?yàn)閟u - 的這種方式不是都能達(dá)到目的的
如:sshd 這個(gè)用戶沒(méi)有登入權(quán)限為nologin的 就不能用su - 來(lái)完成了
如:
注: 默認(rèn)root 是可以不用密碼,切換到任何用戶的
且看:
[root@mail ~]# cat /etc/sudoers | grep root
## the root user, without needing the root password.
## Allow root to run any commands anywhere?
root ? ?ALL=(ALL) ? ALL
## cdrom as root
經(jīng)典用法:
sudo -u zhiliang sh -c 'cd /home/zhiliang; touch 1'?
35 source filename.sh ?和 ./filename.sh ?和 sh filename.sh /root/filename.sh 的各種區(qū)別
./filename.sh ?和 /root/filename.sh ?相似必須要有執(zhí)行權(quán)限和 首行
#/bin/bash 定義解釋程序
不能filename.sh 的原因是shell終端會(huì)將它視為命令,而/root/filename.sh 是”/“開(kāi)頭的,shell就知道是一個(gè)文件,不是個(gè)命令
sh filename.sh 的是將這個(gè)sh腳本文件作為sh的參數(shù)執(zhí)行
source filename.sh 的之前的執(zhí)行方式的區(qū)別本質(zhì)是,沒(méi)有開(kāi)始子shell,是在本shell的環(huán)境中執(zhí)行!
[root@master ~]# cat test.sh?
#!/bin/bash
a=1
source test.sh
和 sh test.sh?
區(qū)別
是 source 執(zhí)行的的時(shí)候 echo $a是有的,sh執(zhí)行的是沒(méi)有a這變量的
還有一個(gè)不常見(jiàn)的是exec ?可以研究下
exec 3 cat <&3 36 nc 命令 nc包 nc-1.84-22.el6.x86_64? -l 監(jiān)聽(tīng) -w 設(shè)置空閑超時(shí),自動(dòng)斷開(kāi) ,默認(rèn)不超時(shí) -u UDP 用途: 1 傳送文件 監(jiān)聽(tīng)方 ?: nc -l 1234 > receive.txt 傳送方: nc 192.168.7.235 1234 < send.txt 注: 傳送方將,將一個(gè)文本文件,通過(guò)連接socket 傳送個(gè)socket,監(jiān)聽(tīng)方(接收方)將接收到的文件,輸入到receive.txt 文件 2 傳送目錄 監(jiān)聽(tīng)方 ?: nc -l 1234 | ?tar xzvf - 傳送方: ?tar czvf - dir | nc 192.168.7.235 1234 3 掃描端口 nc -v -w 10 192.168.7.234 80 或一些列端口 nc -v -w 10 192.168.7.234 -z 80-100? 37 find 按返回查找一個(gè)模糊文件 find /data/path/… -name 1*.py 38 /dev/shm ? linux內(nèi)存設(shè)備目錄入口 echo “abc-test” > /dev/shm/abc.txt cat /dev/shm/abc.txt 作用: 需要快速提取的文件,可以這以寫(xiě)入這個(gè)目錄下,一直在內(nèi)存中的運(yùn)行 注: 1 重啟丟失 2 默認(rèn)是內(nèi)存的一半大小 3 文件系統(tǒng)是tmpfs 4 區(qū)別swap這個(gè)虛擬內(nèi)存 39 screen? screen -S name ?創(chuàng)建一個(gè)這樣的窗口 虛擬終端 screen -ls screen -r name/id ?恢復(fù)窗口 ctrl +a +d 退出但不關(guān)閉窗口 ctrl +a ?+k 殺掉當(dāng)前會(huì)話窗口 ctrl +a +z 將這個(gè)會(huì)話掛起回到 SHLVL=1 的狀態(tài)(fg 1 恢復(fù)) screen -d pid/name 將這個(gè)窗口置為離線 echo $SHLVL 可以檢查是不是在窗口中還是在正常的shell終端中 screen -x 多個(gè)人同時(shí)可以看處于Attached的窗口動(dòng)態(tài)(適合遠(yuǎn)程多個(gè)人需要看屏 幕)? 注: screen 中會(huì)話的三種狀態(tài) 1 Attached ?處于運(yùn)行當(dāng)中的,如果你要 screen -x name/pid 可以看? 2 Detached 處于離線的 screen -r name/pid 可以恢復(fù)到那個(gè)窗口 3 Dead 處于被kill -9 pid 殺死的,如果需要移除 screen -wipe pid/name 40 uname -i = arch 獲取 ?hardware platform 41 shell 自定義函數(shù)庫(kù)和引入函數(shù)庫(kù) shell函數(shù)互相調(diào)用的 ?# Source function library. . ./ 一般自己寫(xiě)的函數(shù)推薦和函數(shù)庫(kù)放在同一級(jí)目錄下! 方便移動(dòng) 42: 測(cè)試速度 ssh的吞吐量 yum install pv yes | pv | ssh 192.168.7.235 "cat > /dev/null” 43? 客戶端連接數(shù)據(jù) mysql -h292.168.7.235 ?-uroot -p 基本數(shù)據(jù)庫(kù)語(yǔ)法: grant all on *.* to 'cui'@'192.168.7.235' identified by '12qwaszx'; ?select user,password,host from mysql.user; 44 ssh使用自動(dòng)化的選項(xiàng) ssh $ip -o UserKnownHostsFile=/dev/null -o ConnectTimeout=3 ?-o BatchMode=yes -o StrictHostKeyChecking=no? 45 shell命令組合 為了在當(dāng)前shell中執(zhí)行一組命令 ()運(yùn)算符: ? ? ( 命令;命令;命令… ) 用處一般是, ls b.txt || ( echo "one" && echo "two” )’? 或 ls b.txt || ( echo "one" ; echo "two” )? 46 mkpasswd 創(chuàng)建隨機(jī)密碼(可指定長(zhǎng)度和復(fù)雜度) 常用于和 ?echo “password” | passwd —stdin ? root ? 連用 mkpasswd -l 8 -s 2?? -l 密碼長(zhǎng)度 -s 特殊字符的個(gè)數(shù) 如結(jié)果:?s|7dF5_V echo “s|7dF5_V” ? | passwd —stdin root 47 iptables和tcpdump經(jīng)常不記得命令 tcpdump -nn port 53 iptables -A INPUT ?-s 10.1.110.30 -p udp —dport 53 iptables -D ?INPUT ?number -vv -e ?可顯示mac地址 -nn 不反解 src 關(guān)鍵字 源ip地址 dst 目標(biāo)地址 dst port 22 目標(biāo)端口 srt port 22 源端口 or 或者 and 且 ?tcpdump -vv dst port 22 tcpdump 'port 80 and (host 192.168.1.10 or host 192.168.1.11)’ 48 如何查看一個(gè)應(yīng)用處于堵塞狀態(tài) 如 DNS堵塞了 netstat -tulnp | grep 53 查看 查看第一個(gè)數(shù)字的大小,如果有堵塞就不為0 意義: Recv-Q: 多少個(gè)bytes沒(méi)有被傳入到 socket當(dāng)中? Send-Q: 多少bytes沒(méi)有被遠(yuǎn)端接收識(shí)別? 49 [ -s file ] ?如果文件存在且有內(nèi)容(文件中有內(nèi)容)則為真 #!/bin/bash if [!-s"b"] then ? ??echo"空文件或者文件不存在" else ? ??echo"文件中存在內(nèi)容" fi ~? ? 50?linux文件刪除的原理 51 awk的多分割符 echo "-----1:-----2:"? | awk -F "[-:]+" '{print $2}' 52 三劍客取行 ifconfig eth0 | grep "inet addr" | awk -F "[ :\t]+" '{print $4}' ifconfig eth0 | sed -n '2p' | awk -F "[ :\t]+" '{print $4}' ifconfig eth0 |? awk -F "[ :\t]+" 'NR ==2 {print $4}' 注: NR: 當(dāng)前處理的行號(hào) 52 linux中的正則 BRE(十個(gè))和 ERE 1). ? 任意一個(gè)字符,但不含(\n) 2)* ?匹配前面的0到無(wú)窮個(gè)重復(fù)次數(shù) 3) ?[0-9] ? 匹配0-9 4) \ ?轉(zhuǎn)義字符,將特殊字符還原本性 5) .* ? ?任意字符,匹配重復(fù)任意次數(shù) 6)^ ? 匹配行的的開(kāi)頭 7)$ 結(jié)尾 8) ?\{n,m\} ?匹配前面的n到m次 ? 用egrep命令不需要轉(zhuǎn)義 \{n,\} \{n\} egrep? --color=auto "r{1,5}" /etc/passwd grep -E --color=auto "r{1,5}" /etc/passwd 等于 grep --color=auto "r\{1,5\}" /etc/passwd ?[[:alnum:]]?means?[0-9A-Za-z], [[:space:]] ? ERE (egrep) | () ?組 + ? egrep??--color=auto "^(root|sshd):" /etc/passwd? ? ? ??A regular expression may be followed by one of several repetition operators: ?? ? ???? ? ? The preceding item is optional and matched at most once. ?? ? ??*? ? ? The preceding item will be matched zero or more times. ?? ? ??+? ? ? The preceding item will be matched one or more times. ?? ? ??{n}? ? The preceding item is matched exactly?n?times. ?? ? ??{n,}?? The preceding item is matched?n?or more times. ?? ? ??{,m}?? The preceding item is matched at most?m?times. ?? ? ??{n,m}? The preceding item is matched at least?n?times, but not more than?m?times. 在man grep ?過(guò)濾??REGULAR ?進(jìn)行查找 53 正則結(jié)合sed做替換 sed ’s#正則#不可用正則表達(dá)式#g’ ?作用替換為空 結(jié)合se的小括號(hào)分組的功能 ifconfig eth0 | sed -n 's#^.*inet addr:\(.*\)? Bcast.*$#\1#gp' [root@master ~]# ifconfig eth0 | sed -n 's#^.*inet addr:\(.*\)? Bcast:\(.*\) M.*$#\1 \2#gp' 192.168.7.235 192.168.7.255 取數(shù)字權(quán)限 ?stat file1 | sed -n 's#^.*s: (\([0-9]*\).*$#\1#gp' 等于 stat -c %a file1 54 tree的選項(xiàng) tree -dL 2 -d 只打印目錄 -L ?打印的層級(jí) -L 1只打印一級(jí) -i 不縮進(jìn) -f 打印全路徑 tree -idL 1 |egrep -v "^$|direct|\." | xargs du? -sh 55 運(yùn)維最小化原則 1 系統(tǒng)最小化 2 服務(wù)啟動(dòng)最小化 3 操作最小化 ?rm -f file.txt (不用rm -rf file.txt) 4 登入最小化不用root 5 權(quán)限最小化 6 配置參數(shù)最小化 56 文件修改前進(jìn)行備份 cp file file.ori 修改后對(duì)比 vimdiff file file.ori 57? 更改sshd_config 如何切換到root(有root權(quán)限)的方式: 注: 不能sudo 使用的命令 1 內(nèi)置命令如 type 2 path中不能找到的命令 58 加大文件描述符 [root@shop-web01 ~]# ulimit -n 65536 默認(rèn)是1024 /etc/security/limits.conf? 可直接執(zhí)行 echo “* ? ? - ?nofile ? 65535” >> /etc/security/limits.conf 59 簡(jiǎn)單加密shell文件 方法一: gzexe (加密同事壓縮) 會(huì)把原來(lái)沒(méi)有加密的文件備份為 file.sh~ ,同時(shí) file.sh 即被變成加密文件 還原: gzexe -d file.sh 60 防*** 隱藏版本信息 > /etc/issue 61 鎖定系統(tǒng)重要文件 上鎖 chattr +i /etc/passwd /etc/group /etc/shadow /etc/gshadow 解鎖 chattr -i A file with the ‘i’ attribute cannot be modified 62 默認(rèn)的國(guó)外rpm源更改為國(guó)內(nèi)源 http://mirrors.163.com/.help/centos.html 63 windows中文件的類(lèi)型是通過(guò)擴(kuò)展名(.txt)來(lái)區(qū)分的 file.txt file是文件名 .txt是擴(kuò)展名 linux的擴(kuò)展名和文件類(lèi)型沒(méi)關(guān)系,只是沿用windows的習(xí)慣進(jìn)行易于用戶識(shí)別 64 linux中- 的文件為普通文件,按照文件內(nèi)容又大致可分為三種 1 ASCII 純文本文件 2 二級(jí)制文件,一般是可執(zhí)行的命令 ?cat ls cd 3 data文件 數(shù)據(jù)格式文件,[root@www py]# file /var/log/wtmp /var/log/wtmp: dat 通過(guò)file命令去判斷普通文件的類(lèi)型 65 過(guò)濾本路徑下的目錄 ls -l | grep “^d” 或者 tree -diL1 ?| grep “[a-Z]” 66 inode存儲(chǔ)的信息,唯獨(dú)不包含文件名 67 ssh工具 windows客戶端和linux服務(wù)器之間傳送工具 1?rz?sz 2?winscp?基於ssh?sftp 3?SFX(xshell) 4?sftp?基於SSH?加密傳輸 5?samba?http?ftp?nfs 注意: sftp 連接方式: ?sftp?-o?Port=22??root@192.168.100.13 68? . /etc/init.d/functions 專(zhuān)業(yè)腳本 #!/bin/bash .?/etc/init.d/functions action??"scp?ile?to??remotedir?is?ok"?/bin/true 69 : 25 Apr 15:30:17 ntpdate[11520]:?no server suitable for synchronization found 其實(shí),這不是一個(gè)錯(cuò)誤。而是由于每次重啟?NTP?服務(wù)器之后大約要?3?-?5?分鐘客戶端才能與?server?建立正常的通訊連接。當(dāng)此時(shí)用客戶端連接服務(wù)端就會(huì)報(bào)這樣的信息。一般等待幾分鐘就可以了。 70 ssh 執(zhí)行sudo命令 ssh?執(zhí)行sudo命令 [?root@master?~]#?tail?-1?/etc/sudoers oldbody?????????ALL=(ALL)???NOPASSWD:?/bin/cp [?oldboy@master?~]$?scp?hosts??oldboy@192.168.100.13:~ hosts????????????????????????????????????????????????????????????????????????100%??184?????0.2KB/s???00:00???? [?oldboy@master?~]$?ssh??oldboy@192.168.100.13?sudo?cp?~/hosts?/etc/ sudo:?sorry,?you?must?have?a?tty?to?run?sudo 解決方式: 2種 1 -t 選項(xiàng) [?oldboy@master?~]$?ssh?-t??oldboy@192.168.100.13?sudo?cp?~/hosts?/etc/????? Connection?to?192.168.100.13?closed. 原理來(lái)源:?查看sudoers文件: #?Disable?"ssh?hostname?sudo? #?????????You?have?to?run?"ssh?-t?hostname?sudo? # Defaults????requiretty 71 sort的深入 -r? -n -k -t 對(duì)這個(gè)arp文件以ip地址的大小排序 (第三列排完排第四列) cat.arp 192.168.0.1???00:0c:29:65:14:0f???????????????????????? 192.168.1.10???00:0c:29:65:14:0f???????????????????????? 192.168.20.9???00:0c:29:65:14:0f???????????????????????? 192.168.0.10???00:0c:29:65:14:0f???????????????????????? 192.168.1.11???00:0c:29:65:14:0f???????????????????????? 192.168.10.10???00:0c:29:65:14:0f???????????????????????? 192.168.200.8???00:0c:29:65:14:0f???????????????????????? 192.168.19.2????00:50:56:f9:96:ad 結(jié)果: [?oldboy@slave?~]$?cat?arp.txt?|?sort?-n?-t"."??-k3,3?-k4.1,4.3 192.168.0.1???00:0c:29:65:14:0f???????????????????????? 192.168.0.10???00:0c:29:65:14:0f???????????????????????? 192.168.1.10???00:0c:29:65:14:0f???????????????????????? 192.168.1.11???00:0c:29:65:14:0f???????????????????????? 192.168.10.10???00:0c:29:65:14:0f???????????????????????? 192.168.19.2????00:50:56:f9:96:ad???????????????????????? 192.168.20.9???00:0c:29:65:14:0f???????????????????????? 192.168.200.8???00:0c:29:65:14:0f? 命令解釋: ?sort?-n?-t"."??-k3,3?-k4.1,4.3 以-n 數(shù)字排序,以-t"." 分列,以-k第三列的(第一個(gè)字符開(kāi)始)到第三列的(最后字符)結(jié)束 在-k 第四列的第一個(gè)字符開(kāi)始到第四列的三個(gè)字符排序?yàn)閗結(jié)束 ==???sort?-n?-t"."??-k3,3?-k4 ?雖然結(jié)果一樣但后排序的時(shí)間要長(zhǎng)(因?yàn)?k4 是一默認(rèn)第一個(gè)字符到第四列結(jié)束 這樣就會(huì)包括mac地址參與了排序) 72 awk的庖丁解牛 [?oldboy@slave?~]$?cat?access.log? http://www.baidu.com/index.html http://www.12306.cn/jsp.php http://www.sina.com.cn/index.html http://www.12306.cn/jsp.php http://www.sina.com.cn/index.html http://www.12306.cn/jsp.php http://www.taobao.com/ http://www.baidu.com/index.html [?oldboy@slave?~]$?cat?access.log??|?awk?-F?'/'?'{print?$3}'?|?sort?-rn?|?uniq?-c ??????1??www.taobao.com ??????2??www.sina.com.cn ??????2??www.baidu.com ??????3??www.12306.cn 等于使用awk的數(shù)組方式進(jìn)行排序統(tǒng)計(jì) [?oldboy@slave?~]$?cat?access.log??|?awk?-F?'/'?'{print?$3}'?|??awk?'{++S[$NF]?}?END?{?for(k?in?S)?print?S[k],k?}'?|?sort?-n? 1??www.taobao.com 2??www.baidu.com 2??www.sina.com.cn 3??www.12306.cn awk?的統(tǒng)計(jì)數(shù)組 awk?'{++S[$NF]?}?END?{?for(k?in?S)?print?S[k],k?}' 庖丁解牛: S[]????????定義一個(gè)名爲(wèi)S的數(shù)組,在awk中,數(shù)組下飈通常是從1開(kāi)始,而不是0 NF????????當(dāng)前記錄里域個(gè)數(shù),默認(rèn)以空格分隔,如上所示的記錄,NF域個(gè)數(shù)等於1 $NF????????表示一行的最後一個(gè)域的值,$NF?等於$1在上述中 S[$NF]??表示數(shù)組元素的值,如上述表示網(wǎng)站爲(wèi)key的值 ++S[$NF]???表示把某個(gè)數(shù)加一,如上訴的記錄是把站點(diǎn)名加一 END?????????awk行處理完執(zhí)行的語(yǔ)句塊 for?(key?in?S?)?遍歷 print?S[k],k??打印值 awk?的統(tǒng)計(jì)數(shù)組 awk?'{++S[$NF]?}?END?{?for(k?in?S)?print?S[k],k?}' 庖丁解牛: S[]????????定義一個(gè)名爲(wèi)S的數(shù)組,在awk中,數(shù)組下飈通常是從1開(kāi)始,而不是0 NF????????當(dāng)前記錄里域個(gè)數(shù),默認(rèn)以空格分隔,如上所示的記錄,NF域個(gè)數(shù)等於1 $NF????????表示一行的最後一個(gè)域的值,$NF?等於$1在上述中 S[$NF]??表示數(shù)組元素的值,如上述表示網(wǎng)站爲(wèi)key的值 ++S[$NF]???表示把某個(gè)數(shù)加一,如上訴的記錄是把站點(diǎn)名加一 END?????????awk行處理完執(zhí)行的語(yǔ)句塊 for?(key?in?S?)?遍歷 print?S[k],k??打印值 注意: awk可以直接處理文本,可以單獨(dú)awk文本不需要cat下文本先,提高性能. 2統(tǒng)計(jì)netstat的tcp 連接狀況的統(tǒng)計(jì)值 [?oldboy@slave?~]$?netstat?-an?|awk?'?/^tcp/?{?++S[$6]?}?END?{for?(k?in?S?)?print?S[k]"\t"k}'? 2???????ESTABLISHED 10??????LISTEN 3 統(tǒng)計(jì)外網(wǎng)的IP地址不論什么狀態(tài) [?oldboy@slave?~]$?netstat?-an?|awk?-F?"[?:]+"?'/^tcp/?{?++S[$6]?}?END?{for?(k?in?S)?print?k,S[k]}'??|?grep?"^[0-9]"?|?sort?-n 0.0.0.0?5 192.168.100.10?1 192.168.100.1?1 73 文件如果有執(zhí)行權(quán)限是可以tab不全出來(lái)的(目錄是可以不全的,因?yàn)橛袌?zhí)行權(quán)限) 如 /etc/init.d/rsyslog 是可以補(bǔ)全 而 /var/log/mes ?是沒(méi)法不全的 74 bash管道進(jìn)行執(zhí)行 ?cat?a.log?|?bash 75 過(guò)濾文件行中后面的幾個(gè)字段 [?root@log_server?zhiliang.cui]#?cat?column.log? 1?ls?/etc/init.d/ 2?cd?/root/ 33?bash?x.sh?1?2 45?echo?"abc"? 46?echo?$? [?root@log_server?zhiliang.cui]#?grep?-o?"[a-Z].*"?column.log? ls?/etc/init.d/ cd?/root/ bash?x.sh?1?2 echo?"abc"? echo?$? 注意: 如果第一列中有字母grep就不出了 去除文件中除第一列之外的所有列? [?root@log_server?zhiliang.cui]#?cat?column2.log? 1a?ls?/etc/init.d/ 2b?cd?/root/ 33?bash?x.sh?1?2 45?echo?"abc"? 46?echo?$? [?root@log_server?zhiliang.cui]#??awk?'{for(i=2;i<=NF;++i)?printf?$i?"?";printf?"\n"}'?column2.log? ls?/etc/init.d/? cd?/root/? bash?x.sh?1?2? echo?"abc"? echo?$?? 或者: awk?'{for(i=2;i<=NF;++i)?printf?$i?"?"}?{printf?"\n"}'?column2.log 注釋:使用printf而不是用print的原因是print默認(rèn)輸出換行符,而printf默認(rèn)不輸出 76 ssh 拷貝id_rsa.pub 指定特殊端口 ssh-copy-id? "-p 58422 ldap-test03.beta"? 77.sort 的面試題 1 2 3 三個(gè)文件,只用到sort uniq -d uniq -u? 得出 X=1交集2交集3 ? ?cat 1.txt 2.txt 3.txt | sort | uniq -d Y=1-2-3 取差集 ? cat 1.txt 2.txt 3.txt | sort | uniq -u Z=1并集2并集3 ? ?cat 1.txt 2.txt 3.txt | sort | uniq? sort 默認(rèn)從下到大排序行 解釋: -d 顯示有重復(fù)的行 -u 顯示文件中不重復(fù)的行 78 面試題: 打印1到20之間的奇數(shù) python方法: In [7]:?for i in range(1,20): ?? ...:?? ? if i%2 == 1: ?? ...:?? ? ? ? print i shell 方法: for((i=1;i<20;i++)) do ? ??if [$(($i%2))-eq1];then ? ? ? ??echo$i ? ??fi done 或者 for?i?in`seq?120` do ? ??if [$(($i%2))-eq1];then ? ? ? ??echo$i ? ??fi done 79 面試題: apache 的兩種工作模式 prefork worker 80 面試題: http的請(qǐng)求和響應(yīng)信息 請(qǐng)求: HTTP請(qǐng)求的格式如下所示: 如: GET / HTTP/1.1 Referer: 響應(yīng): 如下所示,HTTP響應(yīng)的格式與請(qǐng)求的格式十分類(lèi)似: 81 cookie 和session的區(qū)別 82 面試題: 假設(shè)Apache產(chǎn)生的日志文件名為access_log,在apache正在運(yùn)行時(shí),執(zhí)行命令mv ?access_log access_log.bak,執(zhí)行完后,請(qǐng)問(wèn)新的apache的日志會(huì)打印到哪里,請(qǐng)選擇下列描述正確的是 解釋:雖然此時(shí)文件被改名,但是由于服務(wù)正在運(yùn)行,因?yàn)樗膇node節(jié)點(diǎn)的位置沒(méi)有變,程序打開(kāi)的fd仍然會(huì)指向原來(lái)那個(gè)inode,不會(huì)因?yàn)槲募母淖兌淖?。apache會(huì)繼續(xù)向已改名的文件中追加日志。 83 tcpdump 抓包 源地址 源端口 -vv -e ?可顯示mac地址 src 關(guān)鍵字 源ip地址 dst 目標(biāo)地址 dst port 22 目標(biāo)端口 srt port 22 源端口 or 或者 and 且 ?tcpdump -vv dst port 22 tcpdump 'port 80 and (host 192.168.1.10 or host 192.168.1.11)' 84 tcp的三次握手和4次斷開(kāi) 在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接,如圖1所示。? 由于TCP連接是全雙工的,因此每個(gè)方向都必須單獨(dú)進(jìn)行關(guān)閉。這個(gè)原則是當(dāng)一方完成它的數(shù)據(jù)發(fā)送任務(wù)后就能發(fā)送一個(gè)FIN來(lái)終止這個(gè)方向的連接。收到一個(gè) FIN只意味著這一方向上沒(méi)有數(shù)據(jù)流動(dòng),一個(gè)TCP連接在收到一個(gè)FIN后仍能發(fā)送數(shù)據(jù)。首先進(jìn)行關(guān)閉的一方將執(zhí)行主動(dòng)關(guān)閉,而另一方執(zhí)行被動(dòng)關(guān)閉。? 85 mysql忘記密碼的快速處理方法: killall mysqld mysqld_safe --skip-grant-tables & mysql -uroot? update mysql.user set password=PASSWORD('12qwaszx') where User='root' flush privileges; quit killall mysqld /etc/init.d/mysqld start ps -ef | grep mysql 86 清空zabbix的history表的數(shù)據(jù) 但是 mysql mysql 1635778560 2月? 19 21:02 history.ibd 通過(guò)?housekeeper 進(jìn)程執(zhí)行 如果完全情況history,一天的數(shù)據(jù)會(huì)沒(méi)有,但是趨勢(shì)數(shù)還是有的,趨勢(shì)數(shù)據(jù)好幾天的也會(huì)沒(méi)有 實(shí)驗(yàn)得到的 87: 詳細(xì)說(shuō)明vim 寫(xiě)文件都磁盤(pán)的過(guò)程 面試題(越詳細(xì)越好) 88 wget -q -P directory file -P: 下載的目錄前綴,默認(rèn)是本目錄 89 獲取序列的方法:---自行體會(huì) [andy@master?~]$?seq?-s?"?"?1?100 1?2?3?4?5?6?7?8?9?10?11?12?13?14?15?16?17?18?19?20?21?22?23?24?25?26?27?28?29?30?31?32?33?34?35?36?37?38?39?40?41?42?43?44?45?46?47?48?49?50?51?52?53?54?55?56?57?58?59?60?61?62?63?64?65?66?67?68?69?70?71?72?73?74?75?76?77?78?79?80?81?82?83?84?85?86?87?88?89?90?91?92?93?94?95?96?97?98?99?100 [andy@master?~]$? [andy@master?~]$? [andy@master?~]$?echo?{1..100}?|?tr?"?"?"+" 1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100
<request-line>
<headers>
<blank line>
[<request-body>]
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
<status-line>
<headers>
<blank line>
[<response-body>]
正如你所見(jiàn),在響應(yīng)中唯一真正的區(qū)別在于第一行中用狀態(tài)信息代替了請(qǐng)求信息。狀態(tài)行(status line)通過(guò)提供一個(gè)狀態(tài)碼來(lái)說(shuō)明所請(qǐng)求的資源情況。以下就是一個(gè)HTTP響應(yīng)的例子:
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
(1)第一次握手:建立連接時(shí),客戶端A發(fā)送SYN包(SYN=j)到服務(wù)器B,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器B確認(rèn)。?
(2)第二次握手:服務(wù)器B收到SYN包,必須確認(rèn)客戶A的SYN(ACK=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(SYN=k),即SYN+ACK包,此時(shí)服務(wù)器B進(jìn)入SYN_RECV狀態(tài)。?
(3)第三次握手:客戶端A收到服務(wù)器B的SYN+ACK包,向服務(wù)器B發(fā)送確認(rèn)包ACK(ACK=k+1),此包發(fā)送完畢,客戶端A和服務(wù)器B進(jìn)入ESTABLISHED狀態(tài),完成三次握手。?
完成三次握手,客戶端與服務(wù)器開(kāi)始傳送數(shù)據(jù)。
(1)客戶端A發(fā)送一個(gè)FIN,用來(lái)關(guān)閉客戶A到服務(wù)器B的數(shù)據(jù)傳送(報(bào)文段4)。?
(2)服務(wù)器B收到這個(gè)FIN,它發(fā)回一個(gè)ACK,確認(rèn)序號(hào)為收到的序號(hào)加1(報(bào)文段5)。和SYN一樣,一個(gè)FIN將占用一個(gè)序號(hào)。?
(3)服務(wù)器B關(guān)閉與客戶端A的連接,發(fā)送一個(gè)FIN給客戶端A(報(bào)文段6)。?
(4)客戶端A發(fā)回ACK報(bào)文確認(rèn),并將確認(rèn)序號(hào)設(shè)置為收到序號(hào)加1(報(bào)文段7)。?
TCP采用四次揮手關(guān)閉連接如圖2所示。truncate
?table
?history;
歷史數(shù)據(jù)保留14天
趨勢(shì)數(shù)據(jù)保留3年
歷史數(shù)據(jù)和趨勢(shì)數(shù)據(jù)的區(qū)別
http://doc.okbase.net/doclist/archive/57552.html
注:
--?清空全部數(shù)據(jù),不寫(xiě)日志,不可恢復(fù),速度極快
truncate
??table
??表名;
?
--?清空全部數(shù)據(jù),寫(xiě)日志,數(shù)據(jù)可恢復(fù),速度慢
delete
??from
??表名
文件卻沒(méi)有被減小或者清空
item 的這個(gè)地方可以優(yōu)化
文章題目:linuxshell總結(jié)歷程
本文鏈接:http://weahome.cn/article/geipig.html