標籤 摘錄 下的所有文章

筆記:一些方便的shell功能

快捷鍵
alt+. 在當前位置插入上一條命令的最後一個參數。
ctrl+x,然後 ctrl+e 在編輯器裡邊編輯當前輸入的內容。
ctrl+r 日誌反查。
alt+# 把當前行變成註釋。

文本替換

~ $ str=hello
~ $ echo ${str/ll/aa} # 文本替換
heaao
~ $ echo ${I:1:2}     # 子字符串
el

快速糾錯

~ $ sduo halt -p
bash: sduo: command not found
~ $ ^sduo^sudo

方便的 ! 字符

~ $ cd /var/www
/var/www $ vim index.html
/var/www $ popd
~ $ !-2 # 執行兩條之前的指令(cd /var/www)
/var/www $

使用 !! 可以調用到上一條命令,所以你可以:

/var/www $ rm index.html
rm: index.html: Permission denied
/var/www $ sudo !!
/var/www $ ls index.html
ls: index.html: No such file or directory
/var/www $ vim index.pho
/var/www $ mv !:1 index.php # !:1 -> 上条指令的第一个参数(mv index.pho index.php)
~ $ touch a b c
~ $ ls -l !:1-2 # 上条指令的第一到第二个参数 (ls -l a b)
-rw-r--r--  1 nat  staff  0 Aug 10 22:00 a
-rw-r--r--  1 nat  staff  0 Aug 10 22:00 b

亦可以使用 !^ 代表第一個參數,!$ 代表最後一個。很好理解,因為 ^ 在通配符中代表行首,$ 在通配符中代表行末。! 亦可以和前面的結合使用,例如 !:s/old/new 也是可行的。

數組

~ $ arr[1]="a"
~ $ arr[2]="b"
~ $ arr[3]="c"
~ $ echo ${#arr[*]}  # 數組大小
3
~ $ echo ${arr[@]}   # 遍歷元素 (例如用作 for element in ${arr[@]})
a b c

命令行參數
bash -n 可以再不執行腳本的情況下,檢查語法。
bash -x 會在執行腳本的時候顯示完整的運行過程,方便除錯。

方便的變量
PROMPT_COMMAND 變量設置後,每次請求命令都會執行其變量內容。

~ $ export PROMPT_COMMAND="date"
Tue Aug 16 22:38:58 EDT 2016
~ $ ls
a  b  c
Tue Aug 16 22:38:58 EDT 2016
~ $

TMOUT 變量,內容是整數,單位是秒。在shell空閒達到這個時間之後,會自動退出。為 root 帳戶設置這個能夠增強安全。
FIGNORE 變量,設置在這裡的內容不會出現在自動補全裡。例如設置 .git 在裡邊,就能夠省去一些麻煩。
SECONDS 變量,能夠計算秒數。

~ $ SECONDS=0
~ $ sleep 5
~ $ echo $SECONDS
5

網絡交互
bash中可以使用 /dev/tcp/ 或者 /dev/udp/ 來進行網絡交互。

~ $ cat < /dev/tcp/time-a.nist.gov/13

57617 16-08-17 02:51:29 50 0 0 400.8 UTC(NIST) * 

這亦可以和fd3結合使用,例如:

~ $ exec 3<>/dev/tcp/nat.moe/80
~ $ echo -e "GET / HTTP/1.1\n\n" >&3
~ $ cat <&3 

隨手摘記:重啟基於tcp的伺服器而不丟包的巧妙做法

最近伺服器上掛著的站多了起來,於是發現重啟httpd時候會丟掉不少的請求… 雖然不是一個很大的問題,但是不解決總是讓人心裡不舒服,故稍作研究,發現了一個利用iptabels DROP請求從而巧妙的解決客戶端被拒絕連線的問題。

想法來自:http://www.mail-archive.com/haproxy@formilux.org/msg06885.html

做法很簡單,就是這樣:

iptables -I INPUT -p tcp --dport the_port_of_server --syn -j DROP
... restart your service ...
iptables -D INPUT -p tcp --dport the_port_of_server --syn -j DROP

簡單來說,就是三個步驟。先DROP通往服務埠的連線,因為是DROP,故客戶端不會收到拒絕連線的資訊。於是客戶端會繼續傳送tcp請求,直到超時或收到響應。之後便是重啟服務,然後移除iptables規則,這時,客戶端便能收到伺服器的迴應了,並且在此期間,客戶端並沒有收到任何伺服器拒絕連線的訊息。