shell 學習筆記(18)
阿新 • • 發佈:2022-04-28
宣告:轉載需署名出處,嚴禁用於商業用途!
1701.大量連線處於 TIME_WAIT 狀態的解決方法:
netstat -nt 看到大量 TIME_WAIT
dmesg 看到 time wait bucket table overflow
解決辦法:1、 /proc/sys/net/ipv4/tcp_max_tw_buckets 過小了,設成540000以上
2、 /sys/module/ip_conntrack/parameters/hashsize 過小了,
設成/proc/sys/net/ipv4/netfilter/ip_conntrack_count這個值的1/4大小較為合適
1702.編譯php出錯:error while loading shared libraries: libmysqlclient.so.18: cannot open shared object:
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib/
照做後仍然報錯,原因是該方法適用於32位系統,64位系統應使用下面的這行
ln -s /usr/local/mysql/lib/libmysqlclient.so.18 /usr/lib64/
另外:在編譯的時候,不寫mysql的路徑,而使用mysqld代替,也可解決該問題的出現。
1703.shell列印當前行號:
echo "$LINENO"
顯示函式在哪一行被呼叫的:
line(){
echo call by line `caller 0 | awk '{print$1}'`
}
line
1704.當系統swap空間所剩不多時,可通過在本地磁碟上建立普通檔案作為swap :
dd一個檔案,然後mkswap,然後swapon
dd if=/dev/zero of=./swapfile bs=1M count=1000
mkswap ./swapfile
swapon ./swapfile
即可為系統臨時增加1G的swap。
使用完畢後執行:
swapoff ./swapfile
rm -f swapfile
1705.多行結果賦值給變數:用引號防止 shell 做 word split:
file=`find . -name "*"`
echo "$file"
1706.wireshark 八進位制編碼問題:
google.com/search?q=淘寶網 這個http請求,抓包裡面對應的內容是
GET /search?q=314324261246315370 HTTP/1.1rn
314324261246315370這一段對應的是淘寶網3個字,應該是gbk,gbk是每個漢子兩個
nnn the eight-bit character whose value is the octal value nnn (one to three digits)
8進位制,轉換成十六進位制看看,再看編碼
CC D4對應314324 echo 0:ccd4|xxd -r|iconv -f gbk -t utf-8
echo $'314324261246315370'|iconv -f gbk -t utf-8
前面要加$,這樣是表示8進位制的
1707.sort -n -g 按數字排序的區別:
-g 通用數值排序,-n 數值排序。
-g 支援的記數方法比 -n 廣,-g 使用標準 C 函式 strtod 來轉換數值,支援科學記數法,如 1.0e-34,
不過 -g 比 -n 慢得多。詳細區別參考info sort文件或者stackoverflow.com。
1708.關於sort -h排序問題:
echo "2025K
1M
1G"|sort -h # du、ls、df 等能保證輸出一定是k<m<g的格式,不會存在2025k這種形式的。
1709.使用 cURL 測試 Web 站點的響應時間:
curl -o /dev/null -s -w %{time_connect}:%{time_starttransfer}:%{time_total} http://www.canada.com
1710.設定使用者的程序數限制:
/etc/security/limits.conf
/etc/profile裡面寫ulimit -n 65535,只有root才能增加,這樣其它使用者登入都會報錯。
nofile 是開啟檔案數,nproc是程序數,soft 指的是當前系統生效的設定值。hard 表明系統中所能設定的最大值。
soft 的限制不能比hard 限制高。用 - 就表明同時設定了 soft 和 hard 的值
1711.ssh不輸出連線資訊:
ssh -t 會輸出一個或者 ssh 加 -q 引數 或者 2>/dev/null 遮蔽掉
1712.wget將頁面內容輸出到標準輸出:
wget -qO- http://shushu.com.cn/tm.php # -qO- 相當於 -q -O -
1713.iptables埠轉發:將本地80埠的請求轉發到8080埠,當前主機ip為192.168.2.1
iptables -t nat -A PREROUTING -d 192.168.2.1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:8080
ssh 或者 haproxy 之類的也可以做埠對映
1714.程序間通訊方式:
PIPE(FIFO)
訊息佇列
訊號量(Semaphore)
共享儲存
SOCKET
1715.執行緒間通訊常用的三種方法:
1.全域性變數
程序中的執行緒間記憶體共享,這是比較常用的通訊方式和互動方式。
注:定義全域性變數時最好使用volatile來定義,以防編譯器對此變數進行優化。
2.Message訊息機制(windows下)
常用的Message通訊的介面主要有兩個:PostMessage和PostThreadMessage執行緒常常要將資料傳遞給另外一個執行緒。
Worker執行緒可能需要告訴別人說它的工作完成了,GUI執行緒則可能需要交給Worker執行緒一件新的工作。
3.CEvent物件(windows下)
CEvent為MFC中的一個物件,可以通過對CEvent的觸發狀態進行改變,從而實現執行緒間的通訊和同步。
1716.本機免key登入:
ssh-keygen -t dsa -f ~/.ssh/id_dsa
cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
1717.curl抓取http返回碼:
curl -so /dev/null -w '%{http_code}n' www.sina.com
1718.ssh -D 一句話代理:
alias proxy='expect -c "spawn ssh -D 127.0.0.1:6789 67.205.5.88 -l username;expect *password* ;send -- "passwordr" ; expect eof"'
alias proxy='expect -c "spawn ssh -D 127.0.0.1:6789 67.205.5.88 -l username;expect *password* ;send -- "passwordr" ; interact"'
1719.ps -ww 不限制寬度輸出:結果也與終端有關
09:19:48#tp#~> ps -few|wc -L
157
09:19:50#tp#~> ps -feww|wc -L
1326
09:19:52#tp#~> echo $COLUMNS
157
1720./dev/null 被cp,許可權被修改:
mknod -m 666 /dev/null c 1 3 # 建立特殊檔案的,比如block或者是管道檔案
1721.每 n 個字元截斷換行的幾種方法:
echo 123190287923849241483971837103921|sed 's/..../&n/g'
dd cbs=4 conv=unblock; fold -c4;grep -Eo '.{1,4}'
1722.awk輸出到管道或者檔案的時候有buffer,一般是4K,到達4K才輸出,輸出到標準輸出沒buffer
i=0;while sleep 0.1;do echo -ne "r"$((i++));done|awk 'BEGIN{ORS=RS="r"}{print $0}'|tee a
可以用這個測試下,如果去掉tee就可以正常顯示,或者去掉awk也可以,兩個都加上就不行,
如果把sleep 0.1改成sleep 0.000001,到達4K的時候就會輸出了,
用fflush()可以重新整理buffer
1723.od進行ascii到八進位制、10進位制、16進位制的轉換:
printf "^A" | od -An -o # -b -x -d
1724.curl測試網路狀況:
curl -so /dev/null -w '%{http_code}' -H host:www.host.com 8.8.8.8/a.txt #測返回碼
curl -sH host:www.host.com 8.8.8.8/a.txt #下載檔案測試
1725.paste -s序列合併檔案內容:
seq 100|paste -sd ' n' #每5個換行
echo {1..100}|xargs -n5 #xargs -n 效率比較低
echo {1..100}|grep -Po '(w+ ?){5}'
1726.printf列印ascii的10進位制值:
printf '%dn' 'c # 'c 意思就是使用字元作為數字值
awk 列印 ascii 對應 10 進位制值:
echo a|awk 'BEGIN{for(i=0;i<255;i++)a[sprintf("%c",i)]=i}{print a[$0]}'
列印ascii的16進位制值:
printf '%02x' "'+" # echo -n '+' | od -tx1 -An | tr -d ' '
1727.- 表示標準輸入或者標準輸出,用法舉例:
tar cvf - * | (cd /dest/dir && tar xvfp -) # - 需要程式自己支援,例如tar、cat,-可以理解為臨時檔案形式存在
-在命令符當中表示標準輸入或者標準輸出。
在tar cvf - *當中,表示標準輸出,因為f引數後面跟的是輸出的,
這個命令的意思就是把當前目錄的所有檔案,tar打包到標準輸出當中
然後通過管道,這個命令的標準輸出作為後面 (cd /dest/dir && tar xvfp -)
命令的標準輸入,cd /dest/dir沒有什麼好說的,切換到那個目錄。
然後tar xvfp表示解壓縮檔案,但是沒有指明是那個具體的檔案?所以就是-了,
表示標準輸入當中獲取檔案,然後解壓縮到噹噹前目錄。
總體來看,這個命令就是拷貝檔案了。
1728.sub()與match()的搭配使用,可逐次取出原字串中合乎指定條件的所有子字串:
awk 'BEGIN {
data = "p12-P34 P56-p61"
while( match( data ,/[0-9]+/) >0) {
print substr(data,RSTART, RLENGTH)
sub(/[0-9]+/,"",data)
}
}' #類似python re中的group或者正則中的捕獲組
1729.巧用find的內建命令:delete、ls等:
find -name "AAA" -ls #同時減少了-exec執行fork帶來的開銷。
find . -name AAA ( -type f -exec ls -l {} ; -o -type d -exec ls -ld {} ; )
1730.顯示所有 ipv4:
ip -o -4 a s
1731.printf -v 直接賦值變數:
printf -v var '%%%02x' 111
1732.awk FIELDWIDTHS 將字串按指定域寬度劃分:
echo '23456.23478.58924.6' | awk -vFIELDWIDTHS="3 6 5 5" -vOFS="t" '{$1=$1;print}'
echo ${A:0:3} ${A:3:6} ${A:9:5} ${A:14:5}
1733.檢視 tcp 連線中 keepalive 的數量:
netstat -town
1734.模擬骰子產生1~6的隨機數:
echo $((0x$(head -c5 /dev/random|xxd -ps)%6+1))
1735.pkill殺程序是模糊匹配,小心誤殺:
pkill aaa ,所有程序名裡包含aaa的都會被幹掉
你可以用pgrep看看,程序名,不包含引數,你還可以指定tty、使用者名稱什麼的
如果要精確匹配:pgrep -lx 類似 grep 的 -x 按行匹配
-f 是不僅僅在程序裡面查,引數也會查 ,就是你pkill -f apache,會把java -u apache也殺掉。預設是隻看程序名是否匹配
pgrep -fl 99
27659 sleep 99
-fx 是完整匹配整個命令列(程序名+引數) ,-x 是完整匹配程序名
1736.pkill 踢出who裡的登入終端或者ip:
pkill -kill -t pts/2
1737.得到10個字元的隨機密碼:
tr -dc A-Za-z0-9_ < /dev/urandom | head -c 10 | xargs
1738.perl列出當前目錄下所有的符號連結:
perl -e 'print map { -l and $_ .= "n" } <*>'
1739.nnohup退出終端會斷掉:
shopt |grep huponexit
grep -iR hup .bashrc .profile /etc/bash* /etc/profile*找下,反正我這沒有,我是off
預設值都是off的,開了就會出現他的那種問題,shell退出不應該給這個shell的子程序發HUP訊號的,可以trap下。
1740.利用nc遠端傳輸檔案:
tar -cf - * | nc 172.20.51.51 5555
1741.正則貪婪匹配陷阱:最左邊的貪婪匹配優先順序最高,後面的匹配都是基於正則的回溯機制,所以後面的都屬於非貪婪匹配了。
*雖然貪婪,但也可能發空匹配,因為他可以為0,而+至少匹配一次,限制較強。
echo "房屋資訊 房屋資訊 1--district 190_360"|sed -r 's/(.*)([0-9]+)_([0-9]+)/=1==2===3/'
=房屋資訊 房屋資訊 1--district 19==0===360
echo "房屋資訊 房屋資訊 1--district 190_360"|sed -r 's/(.*)([0-9]*)_([0-9]*)/=1==2===3/'
=房屋資訊 房屋資訊 1--district 190=====360
echo "房屋資訊 房屋資訊 1--district 190_360"|sed -r 's/(.+)([0-9]+)_([0-9]*)/=1==2===3/'
=房屋資訊 房屋資訊 1--district 19==0===360
echo "房屋資訊 房屋資訊 1--district 190_360"|sed -r 's/(.*) ([0-9]+)_([0-9]*)/=1==2===3/'
=房屋資訊 房屋資訊 1--district ==190===360
1742.rsync -b 更新前先備份:
rsync -b,然後--suffix指定字尾或者--backup-dir指定備份的目錄,mv肯定比cp快,rsync的-b也是mv的
1743.windows下查詢域名對應的所有伺服器:
nslookup -qt=mx web.qq.com
1744.vi一個遠端檔案:
vi scp://username@host//path/to/somefile #注意雙斜線
1745.刪除所有非列印字元:
tr -dc '[:print:]' < filename
1746.PS1 設定putty等ssh工具的標籤頁 title:
PS1='u@h:w$ '
# If this is an xterm set the title to user@host:dir
case "$TERM" in
xterm*|rxvt*)
PS1="[e]0;u@h: wa]$PS1"
;;
*)
;;
esac
或者:
PROMPT_COMMAND='echo -ne "