1 shell 中的數組 能夠是關聯數組,索引值不是數組 0 1 2
php
decalre -A f_value # 申明數組 能夠省略 html
f_value=([apple]='100doll' [orange]='150 doll') 定義數組 node
echo ${f_value[apple]} # 去數組值 python
例如: mysql
declare -A f_fruit # 必定要申明,不一樣於索引爲 0 1 2 的能夠不須要申明 # declare -a A 這是定義 普通的數組linux
f_fruit=([apple]='100RMB' [orange]='50RMB') web
echo ${f_fruit[apple]} 面試
echo ${f_fruit[orange]} 正則表達式
echo ${!f_fruit[*]} 算法
3 sh腳本調試
所有調試 sh -x
部分調試 只調試代碼中的類容
set -x
代碼
set +x
例子:
#!/bin/bash
#
for i in {1..6}
do
set -x
echo $i
set +x
done
echo "script executed"
注: set -x 在執行時顯示參數和命令
set +x 禁止調試上
4 讀取read , 不用enter 回車表示肯定用特定的字符表示結束
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
補充:
-s 無回顯方式如密碼輸入
-t 超時設置
5 運行直到命令成功
repeat()
{ while true : ; do $@ && return; sleep 30;done }
執行函數 repeat wget -c http://download
6 find 的基於depth 深度
find -maxdepth 2 二級
-mindepth 最小的深度
find /data/zhiliang.cui/scripts/ -mindepth 10 -name "*.sh" -print
7 單向散列算法 md5sum
生成校驗和
[ 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 檢查校驗和和文件校驗和比較
文件修改後的結果
--status 不輸出任何東西,通常用於執行返回碼的做用
注:
加密的其餘算法:
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 分隔文件
以大小或者行數分隔 split
-b 以大小分隔 -b 10K 以10K大小一個文件進行分隔
-l 一行數切割
split -b 100K messages-20150212
-a 指定【後綴】長度 默認爲2
-d 以數字做爲分隔後的後綴
默認是字母爲後綴
前綴能夠指定: 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表示使用數組做爲後綴}
-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
注: 擴展 csplit 是split變體工具,支持 以指定文件字符做爲切割符
9 利用並行進程加速執行腳本
^C[ root@cui1 test]# vim sleep
#!/bin/sh
#
pidarray=()
for((i=1;i<=5;i++))
do
sleep 10 &
pidarray+=("$!")
done
wait ${pidarray[@]}
# wait 等待全部的完成
1 放到後臺運行
2 wait 等待全部進程【號】結束才結束腳本
10 迴環文件
dd
mkfs.ext4
mount -o loop
/dev/loop*
10 統計字符個數
[ root@cui1 sh]# echo 123 | wc -c
4
[ root@cui1 sh]# echo -n 123 | wc -c
3
其實-n 只是表示避免添加 額外的換行符
11 wget下載
wget URL
-O 指定下載保存的路徑/文件
-o 下載的log
-t 指定重試的次數
-t 0 無線次數
12 純文本形式dump
lynx URL -dump > file.txt
Lynx 是一個字符界面下的全功能的WWW瀏覽器,支持不少操做系統
lynx -source http://pim.qq.com dump下網頁的source 源文件
12 sftp 模擬ftp格式進入 一個交互式命令
服務器不須要 打開ftp服務,只要
sftp -oPort=22 root@192.168.7.235
13 lastb 失敗登入獲取
14 watch 動態觀察變化
wathc COMMAND
默認2秒
-n SECOND 指定秒數
-d 顏色標明變化的部分
15 fsck
fsck 會自動檢測文件系統類型 調用fsck.type ,可是檢測以前最後作個模擬,
fsck -N 進行模擬,看結果在真正執行,好比fsck可能會將某些扇區標爲壞的扇區,但咱們卻但願從中恢復數據
-A
-A Walk through the /etc/fstab file
fsck檢測時必定不能在掛載狀態
16 shell結合mysql操做的方式
mysql -u $USER -p$PASS << EOF 2> /dev/null
create table students(
id int,
name varchar(100),
mark int
);
EOF
17 ping -c 個數
注: 只要其中有一個值可以ping通,其ech $? 返回值就是 0,若是全部都ping不通 則返回值爲1 (不成功)
18 打印出文件中從第二行開始的文件
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 能夠以大小進行排序,從大到小
經常使用ls -lhS
ls -lhSr
ls -t 已修改的時間進行排序
經常使用ls -lt (從最新的文件到最舊的)
ls -ltr
ls -n 顯示uid 和 gid 而不是用戶名和用戶組
20 gzip
用法
gzip file
默認 源文件被刪除 生成 file.gz
如何 保存源文件且輸出壓縮文件呢 可使用-c 選項original
-c Write output on standard output; keep original files unchanged.
gzip -c file > file.gz
聯想:
cat file1 file2 file3 | gzip > file.gz
gzip -l file.gz 檢查文件的壓縮比
gunzip = gzip -d
gunzip -c file.gz 可以保留原始文件
掛載磁盤,用於修復做用
guestmount -a vm112x113.img -m /dev/sda2 /mnt
21 找出當前你在哪一個shell中
echo 「$0」 或者 ps -p $$ 或者 ps $$
如何找出子的shell 在第幾層 可不能夠退出 ctrl + D
找出子shell的層級或臨時shell的嵌套層級,每一個bash實例啓動後,變量 $SHLVL 的值都會加一
如
echo 「$SHLVL」
結果爲1
輸入 screen
echo 「$SHLVL」
結果爲2
輸入 bash
echo 「$SHLVL」
結果爲3
22 lsof +D /usr/local/ 同上,可是會搜索目錄下的目錄,時間較長
23 find /data/ -name "*sum*" -type d
find /data -name 「keyword」 -type f 查找路徑下關鍵字爲keyword的文件
23 eval
一 e v a l命令將會首先掃描命令行進行全部的置換,而後再執行該命令。該命令適用於那些一次掃描沒法實現其功能的變量。該命令對變量進行兩次掃描。這些須要進行兩次掃描的變量有時被稱爲複雜變量。不過這些變量自己並不複雜。
echo "Last argument os "$(eval echo \$$#)""
eval命令:將參數組合爲一個新的命令,而後交給Shell執行
eval能夠讀取一連串的參數,並依參數自己的內容來執行命令。經常使用來處理Shell腳本中的變量,參數不限數目,參數用分號「;」隔開,若是命令後面不帶參數或者參數爲空,命令將返回0值。
Usage: eval [arg ...]
arg交給eval進行組合的參數
例:
一、編輯一個shell,先定義一個變量並賦值ls命令,以後把這個變量傳遞給eval
#!/bin/bash
#定義變量
command="ls -l /home"
eval $command #訪問變量前面加一個$符號。
二、把ls --color -l \做爲參數傳遞給eval
linux@office:~$ eval 'ls --color -l \'
總計 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 刪除本路徑下 除某個文件外的全部
rm -rf `ls | grep -v "tmux」`
25 cp(scp) 中的重要選項
-p preserver 保留文件的原有權限和時間戳
-r/-R 遞歸的拷貝目錄
-a 等於-p -r -d
注: scp -r d1 d2 的結果是 d2/d1
scp -r d1/* d2 的結果 d2/*
26 kill 掉某個用戶, 強制這個用戶退出
1 w 查看哪些用戶登入
2 ps -ef | grep 「pts/4」
3 kill 掉此用戶的sshd進程便可
kill -9 17306
27 passwd -S 查看密碼的最新更改時間,若是密碼重來沒有更改過能夠判斷此帳戶的建立時間了
[root@cui1 zhiliang]# passwd -S zhiliang
zhiliang PS 2015-08-02 0 99999 7 -1 (密碼已設置,使用 SHA512 加密。)
28 多行變一行,若是有須要能夠將多行實現成爲一行
若是將由必要實現 兩個參數到一行中, 能夠試用xargs -n2
-n Use at most max-args arguments per command line
注: 固然能夠是用awk的多行處理技術實現(待研究)
29:awk -F 」正則表達式"
df -h | grep "/boot" | awk -F "[ \t%]+" '{print $5}’
30
head 和 tail 的高級用法:
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前面有-號,表示打印全部的,除了最後的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 就是輸出從第二行開始的全部行
輸出從第二行開始,也就是過濾到了第一行
31 如何查看一個文件的完整access modify(文件內容被改變) change時間
ls -l filename 看到的只有月日 的modify時間
查看完整時間方法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客戶端的問題
有原始的ftp yum install ftp 和 window上的 等,還有lftp yum install -y lftp
不一樣的命令可能支持的性不同
好比: ftp 上傳的時候 put localfile remotefile (其中remotefile 不能省略也就是說只能重名名文件)
通常推薦使用lftp
用戶名:密碼@remotehost
lftp ftp: NGjZPR86KinJO69Vf@192.168.216.171
33 sh -c 的做用
-c string, shell方式 執行後面string中的一系列命令
sh -c 'cd /data/zhiliang.cui; touch testfiel'
34 sudo 可讓你切換身份來進行某項任務,而不只僅sudo 默認到root用戶
sudo -u username 執行命令
與
su - username 執行命令
二者的區別
前者是以某個用戶的身份去執行,而su - 是切換到這個用戶去執行命令,會先登入,在執行命令,在執行完成以後,會退出!
因此,要以某個身份去執行命令,仍是推薦sudo -u username,由於su - 的這種方式不是都能達到目的的
如:sshd 這個用戶沒有登入權限爲nologin的 就不能用su - 來完成了
如:
注: 默認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
經典用法:
sudo -u zhiliang sh -c 'cd /home/zhiliang; touch 1'
35 source filename.sh 和 ./filename.sh 和 sh filename.sh /root/filename.sh 的各類區別
./filename.sh 和 /root/filename.sh 類似必需要有執行權限和 首行
#/bin/bash 定義解釋程序
不能filename.sh 的緣由是shell終端會將它視爲命令,而/root/filename.sh 是」/「開頭的,shell就知道是一個文件,不是個命令
sh filename.sh 的是將這個sh腳本文件做爲sh的參數執行
source filename.sh 的以前的執行方式的區別本質是,沒有開始子shell,是在本shell的環境中執行!
[root@master ~]# cat test.sh
#!/bin/bash
a=1
source test.sh
和 sh test.sh
區別
是 source 執行的的時候 echo $a是有的,sh執行的是沒有a這變量的
還有一個不常見的是exec 能夠研究下
exec 3<text.txt
cat <&3
36 nc 命令
nc包
nc-1.84-22.el6.x86_64
-l 監聽
-w 設置空閒超時,自動斷開 ,默認不超時
-u UDP
用途:
1 傳送文件
監聽方 : nc -l 1234 > receive.txt
傳送方: nc 192.168.7.235 1234 < send.txt
注: 傳送方將,將一個文本文件,經過鏈接socket 傳送個socket,監聽方(接收方)將接收到的文件,輸入到receive.txt 文件
2 傳送目錄
監聽方 : 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 按返回查找一個模糊文件
find /data/path/… -name 1*.py
38 /dev/shm linux內存設備目錄入口
echo 「abc-test」 > /dev/shm/abc.txt
cat /dev/shm/abc.txt
做用: 須要快速提取的文件,能夠這以寫入這個目錄下,一直在內存中的運行
注: 1 重啓丟失 2 默認是內存的一半大小 3 文件系統是tmpfs 4 區別swap這個虛擬內存
39 screen
screen -S name 建立一個這樣的窗口 虛擬終端
screen -ls
screen -r name/id 恢復窗口
ctrl +a +d 退出但不關閉窗口
ctrl +a +k 殺掉當前會話窗口
ctrl +a +z 將這個會話掛起回到 SHLVL=1 的狀態(fg 1 恢復)
screen -d pid/name 將這個窗口置爲離線
echo $SHLVL 能夠檢查是否是在窗口中仍是在正常的shell終端中
screen -x 多我的同時能夠看處於Attached的窗口動態(適合遠程多我的須要看屏
幕)
注: screen 中會話的三種狀態
1 Attached 處於運行當中的,若是你要 screen -x name/pid 能夠看
2 Detached 處於離線的 screen -r name/pid 能夠恢復到那個窗口
3 Dead 處於被kill -9 pid 殺死的,若是須要移除 screen -wipe pid/name
40 uname -i = arch 獲取 hardware platform
41 shell 自定義函數庫和引入函數庫
shell函數互相調用的
# Source function library.
. ./
通常本身寫的函數推薦和函數庫放在同一級目錄下! 方便移動
42: 測試速度 ssh的吞吐量
yum install pv
yes | pv | ssh 192.168.7.235 "cat > /dev/null」
43
客戶端鏈接數據
mysql -h192.168.7.235 -uroot -p
基本數據庫語法:
grant all on *.* to 'cui'@'192.168.7.235' identified by '12qwaszx';
select user,password,host from mysql.user;
44 ssh使用自動化的選項
ssh $ip -o UserKnownHostsFile=/dev/null -o ConnectTimeout=3 -o BatchMode=yes -o StrictHostKeyChecking=no
45 shell命令組合
爲了在當前shell中執行一組命令
()運算符:
( 命令;命令;命令… )
用處通常是,
ls b.txt || ( echo "one" && echo "two」 )’
或
ls b.txt || ( echo "one" ; echo "two」 )
46 mkpasswd 建立隨機密碼(可指定長度和複雜度)
經常使用於和 echo 「password」 | passwd —stdin root 連用
mkpasswd -l 8 -s 2
-l 密碼長度
-s 特殊字符的個數
如結果: s|7dF5_V
echo 「s|7dF5_V」 | passwd —stdin root
47 iptables和tcpdump常常不記得命令
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 關鍵字 源ip地址
dst 目標地址
dst port 22 目標端口
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 如何查看一個應用處於堵塞狀態 如 DNS堵塞了
netstat -tulnp | grep 53
查看
查看第一個數字的大小,若是有堵塞就不爲0
意義:
Recv-Q: 多少個bytes沒有被傳入到 socket當中
Send-Q: 多少bytes沒有被遠端接收識別
49 [ -s file ] 若是文件存在且有內容(文件中有內容)則爲真
#!/bin/bash
if [!-s"b"]
then
echo"空文件或者文件不存在"
else
echo"文件中存在內容"
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: 當前處理的行號
52 linux中的正則 BRE(十個)和 ERE
1). 任意一個字符,但不含(\n)
2)* 匹配前面的0到無窮個重複次數
3) [0-9] 匹配0-9
4) \ 轉義字符,將特殊字符還本來性
5) .* 任意字符,匹配重複任意次數
6)^ 匹配行的的開頭
7)$ 結尾
8) \{n,m\} 匹配前面的n到m次 用egrep命令不須要轉義
\{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 過濾 REGULAR 進行查找
53 正則結合sed作替換
sed ’s#正則#不可用正則表達式#g’ 做用替換爲空
結合se的小括號分組的功能
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
取數字權限
stat file1 | sed -n 's#^.*s: (\([0-9]*\).*$#\1#gp'
等於
stat -c %a file1
54 tree的選項
tree -dL 2
-d 只打印目錄
-L 打印的層級 -L 1只打印一級
-i 不縮進
-f 打印全路徑
tree -idL 1 |egrep -v "^$|direct|\." | xargs du -sh
55 運維最小化原則
1 系統最小化
2 服務啓動最小化
3 操做最小化 rm -f file.txt (不用rm -rf file.txt)
4 登入最小化不用root
5 權限最小化
6 配置參數最小化
56 文件修改前進行備份
cp file file.ori
修改後對比
vimdiff file file.ori
57
更改sshd_config
如何切換到root(有root權限)的方式:
注: 不能sudo 使用的命令
1 內置命令如 type
2 path中不能找到的命令
58 加大文件描述符
[root@shop-web01 ~]# ulimit -n
65536
默認是1024
/etc/security/limits.conf
可直接執行
echo 「* - nofile 65535」 >> /etc/security/limits.conf
59 簡單加密shell文件
方法一: gzexe
(加密同事壓縮)
會把原來沒有加密的文件備份爲 file.sh~ ,同時 file.sh 即被變成加密文件
還原:
gzexe -d file.sh
60 防***
隱藏版本信息
> /etc/issue
61 鎖定系統重要文件
上鎖
chattr +i /etc/passwd /etc/group /etc/shadow /etc/gshadow
解鎖
chattr -i
A file with the ‘i’ attribute cannot be modified
62 默認的國外rpm源更改成國內源
http://mirrors.163.com/.help/centos.html
63 windows中文件的類型是經過擴展名(.txt)來區分的
file.txt
file是文件名 .txt是擴展名
linux的擴展名和文件類型不要緊,只是沿用windows的習慣進行易於用戶識別
64 linux中- 的文件爲普通文件,按照文件內容又大體可分爲三種
1 ASCII 純文本文件
2 二級制文件,通常是可執行的命令 cat ls cd
3 data文件 數據格式文件,[root@www py]# file /var/log/wtmp
/var/log/wtmp: dat
經過file命令去判斷普通文件的類型
65 過濾本路徑下的目錄
ls -l | grep 「^d」
或者 tree -diL1 | grep 「[a-Z]」
66 inode存儲的信息,惟獨不包含文件名
67 ssh工具
windows客戶端和linux服務器之間傳送工具
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
專業腳本
#!/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
其實,這不是一個錯誤。而是因爲每次重啓 NTP 服務器以後大約要 3 - 5 分鐘客戶端才能與 server 創建正常的通信鏈接。當此時用客戶端鏈接服務端就會報這樣的信息。通常等待幾分鐘就能夠了。
70 ssh 執行sudo命令
ssh 執行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 選項
[ oldboy@master ~]$ ssh -t oldboy@192.168.100.13 sudo cp ~/hosts /etc/
Connection to 192.168.100.13 closed.
原理來源: 查看sudoers文件:
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
# You have to run "ssh -t hostname sudo <cmd>".
#
Defaults requiretty
71 sort的深刻
-r
-n
-k
-t
對這個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
結果:
[ 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 數字排序,以-t"." 分列,以-k第三列的(第一個字符開始)到第三列的(最後字符)結束
在-k 第四列的第一個字符開始到第四列的三個字符排序爲k結束
== sort -n -t"." -k3,3 -k4 雖然結果同樣但後排序的時間要長(由於-k4 是一默認第一個字符到第四列結束 這樣就會包括mac地址參與了排序)
72 awk的庖丁解牛
[ oldboy@slave ~]$ cat access.log
http://www.baidu.com/index.html
http://www.sina.com.cn/index.html
http://www.sina.com.cn/index.html
http://www.baidu.com/index.html
[ oldboy@slave ~]$ cat access.log | awk -F '/' '{print $3}' | sort -rn | uniq -c
等於使用awk的數組方式進行排序統計
[ oldboy@slave ~]$ cat access.log | awk -F '/' '{print $3}' | awk '{++S[$NF] } END { for(k in S) print S[k],k }' | sort -n
awk 的統計數組
awk '{++S[$NF] } END { for(k in S) print S[k],k }'
庖丁解牛:
S[] 定義一個名爲S的數組,在awk中,數組下飈一般是從1開始,而不是0
NF 當前記錄裏域個數,默認以空格分隔,如上所示的記錄,NF域個數等於1
$NF 表示一行的最後一個域的值,$NF 等於$1在上述中
S[$NF] 表示數組元素的值,如上述表示網站爲key的值
++S[$NF] 表示把某個數加一,如上訴的記錄是把站點名加一
END awk行處理完執行的語句塊
for (key in S ) 遍歷
print S[k],k 打印值
awk 的統計數組
awk '{++S[$NF] } END { for(k in S) print S[k],k }'
庖丁解牛:
S[] 定義一個名爲S的數組,在awk中,數組下飈一般是從1開始,而不是0
NF 當前記錄裏域個數,默認以空格分隔,如上所示的記錄,NF域個數等於1
$NF 表示一行的最後一個域的值,$NF 等於$1在上述中
S[$NF] 表示數組元素的值,如上述表示網站爲key的值
++S[$NF] 表示把某個數加一,如上訴的記錄是把站點名加一
END awk行處理完執行的語句塊
for (key in S ) 遍歷
print S[k],k 打印值
注意: awk能夠直接處理文本,能夠單獨awk文本不須要cat下文本先,提升性能.
2統計netstat的tcp 鏈接情況的統計值
[ oldboy@slave ~]$ netstat -an |awk ' /^tcp/ { ++S[$6] } END {for (k in S ) print S[k]"\t"k}'
2 ESTABLISHED
10 LISTEN
3 統計外網的IP地址不論什麼狀態
[ 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 文件若是有執行權限是能夠tab不全出來的(目錄是能夠不全的,由於有執行權限)
如 /etc/init.d/rsyslog 是能夠補全
而 /var/log/mes 是無法不全的
74 bash管道進行執行
cat a.log | bash
75 過濾文件行中後面的幾個字段
[ 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默認輸出換行符,而printf默認不輸出
76 ssh 拷貝id_rsa.pub 指定特殊端口
ssh-copy-id "-p 58422 ldap-test03.beta"
77.sort 的面試題
1 2 3 三個文件,只用到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 默認從下到大排序行
解釋:
-d 顯示有重複的行
-u 顯示文件中不重複的行
78 面試題:
打印1到20之間的奇數
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的請求和響應信息
請求:
HTTP請求的格式以下所示:
<request-line>
<headers>
<blank line>
[<request-body>]
如:
GET / HTTP/1.1
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
Referer:
響應:
以下所示,HTTP響應的格式與請求的格式十分相似:
<status-line>
<headers>
<blank line>
[<response-body>]
正如你所見,在響應中惟一真正的區別在於第一行中用狀態信息代替了請求信息。狀態行(status line)經過提供一個狀態碼來講明所請求的資源狀況。如下就是一個HTTP響應的例子:
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
81 cookie 和session的區別
82 面試題:
假設Apache產生的日誌文件名爲access_log,在apache正在運行時,執行命令mv access_log access_log.bak,執行完後,請問新的apache的日誌會打印到哪裏,請選擇下列描述正確的是
解釋:雖然此時文件被更名,可是因爲服務正在運行,由於它的inode節點的位置沒有變,程序打開的fd仍然會指向原來那個inode,不會由於文件名的改變而改變。apache會繼續向已更名的文件中追加日誌。
83 tcpdump 抓包 源地址 源端口
-vv
-e 可顯示mac地址
src 關鍵字 源ip地址
dst 目標地址
dst port 22 目標端口
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次斷開
在TCP/IP協議中,TCP協議提供可靠的鏈接服務,採用三次握手創建一個鏈接,如圖1所示。
(1)第一次握手:創建鏈接時,客戶端A發送SYN包(SYN=j)到服務器B,並進入SYN_SEND狀態,等待服務器B確認。
(2)第二次握手:服務器B收到SYN包,必須確認客戶A的SYN(ACK=j+1),同時本身也發送一個SYN包(SYN=k),即SYN+ACK包,此時服務器B進入SYN_RECV狀態。
(3)第三次握手:客戶端A收到服務器B的SYN+ACK包,向服務器B發送確認包ACK(ACK=k+1),此包發送完畢,客戶端A和服務器B進入ESTABLISHED狀態,完成三次握手。
完成三次握手,客戶端與服務器開始傳送數據。
因爲TCP鏈接是全雙工的,所以每一個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的鏈接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP鏈接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另外一方執行被動關閉。
(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送(報文段4)。
(2)服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1(報文段5)。和SYN同樣,一個FIN將佔用一個序號。
(3)服務器B關閉與客戶端A的鏈接,發送一個FIN給客戶端A(報文段6)。
(4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1(報文段7)。
TCP採用四次揮手關閉鏈接如圖2所示。
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表的數據
truncate
table
history;
歷史數據保留14天
趨勢數據保留3年
歷史數據和趨勢數據的區別
http://doc.okbase.net/doclist/archive/57552.html
注:
-- 清空所有數據,不寫日誌,不可恢復,速度極快
truncate
table
表名;
-- 清空所有數據,寫日誌,數據可恢復,速度慢
delete
from
表名
可是
mysql mysql 1635778560 2月 19 21:02 history.ibd
文件卻沒有被減少或者清空
item 的這個地方能夠優化
經過 housekeeper 進程執行
若是徹底狀況history,一天的數據會沒有,可是趨勢數仍是有的,趨勢數據好幾天的也會沒有
實驗獲得的
87: 詳細說明vim 寫文件都磁盤的過程 面試題(越詳細越好)
88
wget -q -P directory file
-P: 下載的目錄前綴,默認是本目錄
89 獲取序列的方法:---自行體會
[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