歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> 最牛B的Linux Shell命令 系列連載:(二)

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

日期:2017/2/28 16:31:24   编辑:SHELL編程

本文編譯自commandlinefu.com的系列文章Top Ten One-Liners from CommandLineFu Explained。作為一個由用戶推薦最有用shell命令的網站,其記錄了數以萬計的各色shell命令,其中不乏相當實用和有趣的,本文就要細數當中獲投票最高的一些命令,從其中取材並加以細釋,希望讀者能從中受益。

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

command <CTRL-x CTRL-e>

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

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

如果你喜歡別的編輯器,可以在~/.bashrc裡面放上比如export EDITOR=nano的命令。

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

2.清空或創建一個文件

> file.txt

>在shell裡面是標准輸出重定向符,即把(前部個命令的)命令行輸出轉往一個文件內,但這裡沒有“前部命令”,輸出為空,於是就覆蓋(或創建)成一個空文件了。

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

單純創建文件也可以用$touch file.txt,touch本來是用作修改文件的時間戳,但如果文件不存在,就自動創建了。

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

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

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

實現效果跟術語反向代理是相似的,實際上就是端口轉發,注意上面的描述涉及了3台主機,但當然somemachine可以變成localhost。

這個命令比較抽象,但有時候是很有用的,比如因為眾所周知的原因國內的IP的80端口無法使用,又或者公司的防火牆只給外網開了ssh端口,需要訪問內部服務器一個web應用,以及需要訪問某些限定了來源IP的服務,就可以用上這個方法了。

舉一個具體例子,運行:

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.重置終端

reset

如果你試過不小心cat了某個二進制文件,很可能整個終端就傻掉了,可能不會換行,沒法回顯,大堆亂碼之類的,這時候敲入reset回車,不管命令有沒有顯示,就能回復正常了。

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

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.在午夜的時候執行某命令

echo cmd | at midnight

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

at的參數比較人性化,跟英語語法一樣,可以tomorrow, next week之類的,詳細的查看手冊man at。

6.遠程傳送麥克風語音

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

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

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

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

如果你沒有遠程主機,可以試試這樣:

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

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

但是如果有別的程序正在使用聲卡,這個方法就不湊效了,因為一般的聲卡都不允許多個音頻流同時處理,可以借用alsa組件的工具,arecord跟aplay:

arecord | ssh username@host aplay

本地回放就是:

arecord | aplay

如果你想嚇嚇別人:

cat /dev/urandom | ssh username@host aplay

Copyright © Linux教程網 All Rights Reserved