最牛B的Linux Shell命令 系列連載:(二)

1.用你最喜歡的編輯器來敲命令

1
command <CTRL-x CTRL-e>

在已經敲完的命令後按<CTRL-x CTRL-e>,會打開一個你指定的編輯器(好比vim,經過環境變量$EDITOR指定),裏面就是你剛輸入的命令,而後愛怎麼編輯就怎麼編輯吧,特別是那些參數異常複雜的程序,好比mencoder/ffmpeg,一個命令動輒三、4行的,要修改其中的參數,這個方法最合適不過了,保存退出後自動執行這個程序。php

實際上這是readline庫的功能,在默認狀況下,bash使用的是emacs模式的命令行操做方式,<CTRL-x CTRL-e>是調用這個功能的一個綁定。若是你習慣使用vi模式,按<ESC v>能夠實現一樣功能。html

若是你喜歡別的編輯器,能夠在~/.bashrc裏面放上好比export EDITOR=nano的命令。linux

另一個修改命令的方法是使用fc命令(Fix Command),在編輯器裏面打開上一句命令。咱們的第一輯連載提過一個^foo^bar^命令能夠用fc來實現:fc -s foo=barnginx

2.清空或建立一個文件

1
> file.txt

>在shell裏面是標準輸出重定向符,即把(前部個命令的)命令行輸出轉往一個文件內,但這裏沒有「前部命令」,輸出爲空,因而就覆蓋(或建立)成一個空文件了。git

有些腳本的寫法是:>file.txt,由於:是bash默認存在的空函數。web

單純建立文件也能夠用$touch file.txt,touch原本是用做修改文件的時間戳,但若是文件不存在,就自動建立了。shell

3.用ssh建立端口轉發通道

1
ssh -N -L2001:remotehost:80 user@somemachine

這個命令在本機打開了2001端口,對本機2001端口的請求經過somemachine做爲跳板,轉到remotehost的80端口上。vim

實現效果跟術語反向代理是類似的,實際上就是端口轉發,注意上面的描述涉及了3臺主機,但固然somemachine能夠變成localhost。bash

這個命令比較抽象,但有時候是頗有用的,好比由於衆所周知的緣由國內的IP的80端口沒法使用,又或者公司的防火牆只給外網開了ssh端口,須要訪問內部服務器一個web應用,以及須要訪問某些限定了來源IP的服務,就能夠用上這個方法了。服務器

舉一個具體例子,運行:

1
2
ssh -f -N -L 0.0.0.0:443:twitter.com:443 shell.cjb.net
ssh -f -N -L 0.0.0.0:80:twitter.com:80 shell.cjb.net

而後在/etc/hosts裏面添加127.0.0.1 twitter.com,好吧剩下的你懂的。

固然一般作這個功能的反向代理,應該要用squid、nginx之類,ssh就算是輕量級的嘗試吧!

4.重置終端

1
reset

若是你試過不當心cat了某個二進制文件,極可能整個終端就傻掉了,可能不會換行,無法回顯,大堆亂碼之類的,這時候敲入reset回車,無論命令有沒有顯示,就能回覆正常了。

實際上reset命令只是輸出了一些特殊字符,咱們看BusyBox裏面最簡單的reset程序的實現:

1
printf("\033c\033(K\033[J\033[0m\033[?25h");

輸出的這些字符對Shell是有特殊意義的:

  • \033c: 「ESC c」 – 發送重置命令;
  • \033(K: 「ESC ( K」 – 重載終端的字符映射;
  • \033[J: 「ESC [ J」 – 清空終端內容;
  • \033[0m: 「ESC [ 0 m」 – 初始化字符顯示屬性;
  • \033[?25h: 「ESC [ ? 25 h」 – 讓光標可見;

其中字符顯示屬性常常用來設定打印字符的顏色等,可參考這個博文

5.在午夜的時候執行某命令

1
echo cmd | at midnight

說的就是at這個組件,一般跟cron相提並論,不過at主要用於定時一次性任務,而cron定時週期性任務。

at的參數比較人性化,跟英語語法同樣,能夠tomorrow, next week之類的,詳細的查看手冊man at

6.遠程傳送麥克風語音

1
dd if=/dev/dsp | ssh username@host dd of=/dev/dsp

沒錯就是實現一個喊話器的功能。

/dev/dsp是Linux下聲卡的文件映射(Digital Signal Proccessor),從其中讀數據就是錄音,往裏面寫數據就是播放,至關簡單!

dd是經常使用的數據拷貝程序,若是不一樣時指定if、of,就直接使用stdin/stdout來傳輸。

若是你沒有遠程主機,能夠試試這樣:

1
dd if=/dev/dsp of=/dev/dsp

直接回放麥克風的聲音,只是有一點延時。

可是若是有別的程序正在使用聲卡,這個方法就不湊效了,由於通常的聲卡都不容許多個音頻流同時處理,能夠借用alsa組件的工具,arecord跟aplay:

1
arecord | ssh username@host aplay

本地回放就是:

1
arecord | aplay

若是你想嚇嚇別人:

1
cat /dev/urandom | ssh username@host aplay

7.映射一個內存目錄

1
mount -t tmpfs -o size=1024m tmpfs /mnt/ram

這個命令開了一塊1G內存來當目錄用。不過放心,若是裏面沒文件,是不會佔用內存的,用多少佔多少。

不過通常來講不必手動掛載,由於多數發行版都會在fstab內預留了一個內存目錄,掛載在/dev/shm,直接使用便可;

最多見的用途是用內存空間來放Firefox的配置,可讓慢吞吞的FF快不少,參見Shellex的博文:用tmpfs讓Firefox在內存中飛馳,以及後來的改進:用tmpfs讓Firefox在內存中飛馳II,其中提到的腳原本自speeding up firefox with tmpfs and automatic rsync

那個破爛LinuxQQ也能夠用這個方法,減小由於大量磁盤IO致使的問題。

8.用diff對比遠程文件跟本地文件

1
ssh user@host cat /path/to/remotefile | diff /path/to/localfile -

diff一般的用法是從參數讀入兩個文件,而命令裏面的-則是指從stdin讀入了。

善用ssh可讓web開發減小不少繁瑣,還有好比sshfs,能夠從編輯-上傳-編輯-上傳的人工循環裏面解脫出來。

9.查看系統中佔用端口的進程

1
netstat -tulnp

Netstat是很經常使用的用來查看Linux網絡系統的工具之一,這個參數能夠背下來:

  • -t: 顯示TCP連接信息
  • -u: 顯示UDP連接信息
  • -l: 顯示監聽狀態的端口
  • -n: 直接顯示ip,不作名稱轉換
  • -p: 顯示相應的進程PID以及名稱(要root權限)

若是要查看關於sockets更詳細佔用信息等,可使用lsof工具。

相關文章
相關標籤/搜索