Jump to...
redirecting...

Log for Ubuntu 台灣社群

Bash 等 POSIX shell 裡,`2>&1` 是什麼意思? (★ 105 分)

在 Bash 等 POSIX shell(POSIX:可攜式作業系統介面標準)裡,`2>&1` 用來把標準錯誤輸出 stderr(檔案描述子 file descriptor 2)導向到「當下」標準輸出 stdout(檔案描述子 1)所指向的位置,讓兩種輸出合併成同一條串流,方便再拿去管線處理(例如 `| head`、`| grep`)或統一寫入檔案。這裡的關鍵在 `&`:它告訴 shell 右側的 `1` 代表「檔案描述子 1」,不是名為 `1` 的檔案;因此 `2>1` 其實會被解讀成「把 stderr 重新導向到檔名為 1 的檔案」。

文章也整理了常見重導向寫法:`>` 代表覆寫輸出到檔案、`>>` 代表附加,且可明確指定來源描述子,例如 `1>file` 是 stdout、`2>file` 是 stderr。`2>&1` 的本質是把描述子做「複製/對應」(常以 Unix 系統呼叫 system call 的 `dup2(1, 2)` 來理解),因此「順序」非常重要:shell 會由左到右套用重導向,所以 `cmd >file 2>&1` 會讓 stdout 先去 `file`,接著 stderr 再跟到同一個目的地;但 `cmd 2>&1 >file` 會先把 stderr 指向當時的 stdout(通常是終端機),之後才把 stdout 改到 `file`,造成兩者沒有真的寫到同一處。文中也提到一些捷徑語法,例如把 stdout+stderr 一起導到檔案的 `&>file`(或 `>&file`),以及把 stdout+stderr 一起送進管線的 `|&`(常見於 Bash/zsh)。

Hacker News 留言多半把它視為「老但實用」的咒語:有人笑說自己偶爾會在目錄裡看到一個叫 `1` 的檔案,就是把 `2>&1` 寫成 `2>1` 的副作用;也有人提到近來大型語言模型(LLM, Large Language Model)在呼叫命令列工具時很常自動加上它,因為把錯誤訊息混進同一串流,對機器後續解析或記錄比較省事,而對人類熟手來說也早已是肌肉記憶。

另一派留言則聚焦在「語法為何這麼晦澀」與 shell 的歷史包袱:有人批評以數字暴露檔案描述子太像把底層細節直接丟給使用者,期待有更語意化的寫法(甚至有人提議類似 `&stderr>&stdout` 的可讀語法);也有人反駁當年使用者多是程式設計者/系統管理者,有限字元集下需要區分「檔名」與「描述子」才用 `&`,而簡單、可靠的工具之所以能活數十年正是因為這些設計。留言也補充了實務技巧與陷阱:推薦用 ShellCheck 這類檢查工具避免管線與重導向順序搞錯;以及利用額外描述子(例如 fd 3)把「給機器看的輸出」與「給人看的提示/記錄」分流,甚至有把 JSON 放在 fd 3 作為較穩定的機器可解析通道的做法,同時提醒 `|` 是管線運算子而非單純重導向,會影響整行命令的切分與套用位置。

👥 72 則討論、評論 💬
https://news.ycombinator.com/item?id=47171233
可能寫shell script的人少了
也是UNIX本身的設計
XZ Utils 後門事件始末 [影片] (★ 100 分)

Veritasium 這支影片以「網路差點在幾週內迎來災難」為主軸,回顧 XZ Utils(Linux 常見壓縮工具與函式庫)遭植入後門的事件:看似不起眼的壓縮函式庫一旦被滲透,就可能沿著 Linux 發行版的相依性一路滲入到關鍵元件,甚至影響以 SSH (Secure Shell,安全遠端登入通訊協定) 管理的伺服器登入,讓整個網際網路的基礎設施面臨大規模風險。

影片先從 FSF (Free Software Foundation,自由軟體基金會) 與 Linux 為何如此普及談起,接著用較易懂的方式解釋 SSH 的端對端加密與金鑰概念,並花篇幅講解壓縮的基本原理與常見方法,包含 Huffman、LZ77 與 LZMA(壓縮演算法)。在此基礎上,影片重建 .xz 後門是如何被藏進釋出版本、如何利用相依鏈靠近 OpenSSH 等高價值目標,以及攻擊者(以「Jia Tan」身分活動)如何因程式瑕疵與行為破綻而讓後門曝光,最後延伸到開源與閉源在安全與治理上的拉鋸。

Hacker News 討論串多數人強調,這起事件並非「還沒發生就被擋下」,而是惡意變更已進入 xz 並流入多個大型 Linux 發行版的測試分支;一旦正式進到大量預設安裝,就可能造成 RCE (Remote Code Execution,遠端程式碼執行) 等級的系統性災難。許多留言也反覆提到,事件之所以被揪出,關鍵來自 Andres Freund(當時在 Microsoft 任職)對極小的登入延遲與效能異常的執著追查,甚至被戲稱是「微型基準測試 (microbenchmarking) 拯救世界」;也有人補充 Red Hat 先前已因 Valgrind(記憶體錯誤偵測工具)警告注意到異狀,外界對「是否遲早會被發現」看法不一,但共識是攻擊者只要再縝密一點,後果恐怕難以收拾。

留言也針對「幕後是誰」提出質疑:影片提到提交時間多落在 UTC+8(北京時區)、農曆新年仍在活動但聖誕節停工,以及少數落在 UTC+2/3 的時間帶,因而有人猜測可能與 APT29 (Advanced Persistent Threat 29,疑似俄羅斯官方背景駭客組織,別名 Cozy Bear) 有關;但不少人反駁時區與假期線索很容易偽裝,且 git 的 author/committer 時間差也會誤導歸因。另一條高熱度支線則點名 systemd(Linux 常見的系統初始化與服務管理工具)是關鍵相依:OpenSSH 原本不需要 xz,但部分發行版為了 sd_notify(通知 systemd 服務就緒)而連結 libsystemd,間接把 liblzma(xz 的壓縮函式庫)帶進 sshd 的載入路徑,讓攻擊面被「不必要的相依」放大;事件後不少專案改用更小的自寫實作以避免拉進整套 libsystemd。整體情緒也回到治理與資源分配:與其依賴少數維護者硬撐與偶然運氣,有人主張應以公共資源或機制(例如歐洲的 Sovereign Tech Agency 等)長期資助關鍵開源專案與維護者身心健康,降低供應鏈被社交工程滲透的機率。

👥 41 則討論、評論 💬
https://news.ycombinator.com/item?id=47166473
XDD
fedora 對我也有點難受,半年對開發者來說很短,但對遇到 bug 的用戶來說又很長,屬於兩邊都不討好
debian 是那種我不會踩到什麼問題的發行版,所以沒啥問題
但是我要幫 podman 說聲好話,他是 redhat 體系最棒的東西,不會像 docker 又想要ntr我的其他設定
NTR wwwwww
Arch:?
Arch 大多數包幾小時內就有解
要滾就要滾的夠快,不夠快就很痛苦
OpenSolaris
以前好像還拿過安裝光碟,只是現在連光碟機都沒有,整個穩定 (X)
對啊,所以只能說作者用得不夠多
他到今年2/1還有發archlinux 的文章
看起來只是在嘴fedora這種要滾不滾的玩意
這玩意w