<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Sudo on KnightLi的博客</title>
        <link>https://www.knightli.com/zh-tw/tags/sudo/</link>
        <description>Recent content in Sudo on KnightLi的博客</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-tw</language>
        <lastBuildDate>Fri, 01 May 2026 19:27:08 +0800</lastBuildDate><atom:link href="https://www.knightli.com/zh-tw/tags/sudo/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>sudo 和 sudo-rs 有什麼差異：Rust 版本 sudo 會改變什麼</title>
        <link>https://www.knightli.com/zh-tw/2026/05/01/sudo-vs-sudo-rs-rust-linux-command/</link>
        <pubDate>Fri, 01 May 2026 19:27:08 +0800</pubDate>
        
        <guid>https://www.knightli.com/zh-tw/2026/05/01/sudo-vs-sudo-rs-rust-linux-command/</guid>
        <description>&lt;p&gt;&lt;code&gt;sudo&lt;/code&gt; 是 Linux 使用者最熟悉的命令之一。
它讓普通使用者在授權範圍內臨時以更高權限執行命令，例如安裝軟體、修改系統設定或重啟服務。&lt;/p&gt;
&lt;p&gt;最近 &lt;code&gt;sudo-rs&lt;/code&gt; 受到更多關注，原因是 Ubuntu 25.10 開始預設使用 Rust 實現的 &lt;code&gt;sudo-rs&lt;/code&gt; 來替代傳統 sudo。
對普通使用者來說，表面上仍然輸入 &lt;code&gt;sudo&lt;/code&gt;。
真正變化在系統底層：執行的可能已經是 Rust 版本的 sudo。&lt;/p&gt;
&lt;p&gt;這件事容易引發兩個問題：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;傳統 sudo 出什麼問題了嗎？&lt;/li&gt;
&lt;li&gt;sudo-rs 會不會影響日常使用和伺服器設定？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;簡單結論是：普通桌面使用者基本不用擔心；如果你維護伺服器、寫過複雜 sudoers 規則，或者依賴特殊 sudo 行為，就需要認真測試。&lt;/p&gt;
&lt;h2 id=&#34;sudo-rs-是什麼&#34;&gt;sudo-rs 是什麼
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;sudo-rs&lt;/code&gt; 是用 Rust 編寫的 sudo / su 實現。
它的目標不是創造一個完全不同的新命令，而是重新實現傳統 sudo 的主要功能，同時利用 Rust 的記憶體安全特性降低常見安全風險。&lt;/p&gt;
&lt;p&gt;傳統 sudo 主要由 C 語言編寫，歷史很長，功能也很完整。
這種成熟度帶來穩定性，也帶來維護負擔。
很多程式碼來自很早的 Unix/Linux 使用場景，後來又疊加了大量相容邏輯、擴充和邊界處理。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo-rs&lt;/code&gt; 選擇重新實現，是為了獲得幾個好處：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;借助 Rust 減少記憶體安全問題；&lt;/li&gt;
&lt;li&gt;用更現代的程式碼結構降低維護難度；&lt;/li&gt;
&lt;li&gt;去掉部分歷史功能和高風險預設行為；&lt;/li&gt;
&lt;li&gt;吸引熟悉 Rust 的新貢獻者參與維護；&lt;/li&gt;
&lt;li&gt;為未來權限提升工具提供更容易稽核的基礎。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不過，&lt;code&gt;sudo-rs&lt;/code&gt; 不是傳統 sudo 的 100% 相容替代品。
它仍在發展中，一些傳統功能暫時沒有實現，另一些功能可能不會再實現。&lt;/p&gt;
&lt;h2 id=&#34;普通使用者會感覺到什麼變化&#34;&gt;普通使用者會感覺到什麼變化
&lt;/h2&gt;&lt;p&gt;對普通使用者來說，變化很少。&lt;/p&gt;
&lt;p&gt;你仍然這樣使用：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;或者：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在 Ubuntu 25.10 中，&lt;code&gt;sudo&lt;/code&gt; 會指向 &lt;code&gt;sudo-rs&lt;/code&gt;。
使用者輸入的命令不需要改成 &lt;code&gt;sudo-rs&lt;/code&gt;，腳本裡常見的 &lt;code&gt;sudo&lt;/code&gt; 也不會因為命令名變化而立刻失效。&lt;/p&gt;
&lt;p&gt;比較容易看到的變化是密碼輸入回饋。
&lt;code&gt;sudo-rs&lt;/code&gt; 預設會在輸入密碼時顯示星號。
傳統 sudo 也可以透過設定實現類似效果，但很多發行版預設是不顯示任何字元。&lt;/p&gt;
&lt;p&gt;另外，部分錯誤資訊和警告資訊的文字可能不同。
例如密碼錯誤、權限不足、設定不相容時，提示內容可能和以前不完全一樣。
這對人類使用者影響不大，但如果某些腳本依賴解析 sudo 的錯誤輸出，就需要檢查。&lt;/p&gt;
&lt;h2 id=&#34;管理員需要關注哪些差異&#34;&gt;管理員需要關注哪些差異
&lt;/h2&gt;&lt;p&gt;真正需要注意的是系統管理員和進階使用者。&lt;/p&gt;
&lt;p&gt;傳統 sudo 的生態很大，不少伺服器會有複雜的 sudoers 設定。
這些設定可能包含命令參數匹配、環境變數控制、日誌、郵件通知、PAM 行為和不同主機組策略。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;sudo-rs&lt;/code&gt; 目前和傳統 sudo 存在一些差異。
例如，原文提到 &lt;code&gt;sudo-rs&lt;/code&gt; 不包含傳統 sudo 的 sendmail 支援。
過去有些環境會透過 sendmail 發送 sudo 使用通知，這類設定遷移時就需要換方案。&lt;/p&gt;
&lt;p&gt;認證方面，&lt;code&gt;sudo-rs&lt;/code&gt; 使用 PAM。
這意味著資源限制、umask 等行為應更多透過 PAM 設定，而不是完全依賴 sudoers 文件。
如果你過去在 sudoers 裡處理了很多細節，切換前要確認這些規則是否仍然生效。&lt;/p&gt;
&lt;p&gt;還有一個重要變化是命令參數位置的萬用字元支援。
&lt;code&gt;sudo-rs&lt;/code&gt; 不支援在命令參數位置使用萬用字元，以避免 sudoers 文件中常見的設定錯誤。
這對安全是好事，但可能影響已有規則。&lt;/p&gt;
&lt;h2 id=&#34;ubuntu-裡怎麼處理-sudo-和-sudo-rs&#34;&gt;Ubuntu 裡怎麼處理 sudo 和 sudo-rs
&lt;/h2&gt;&lt;p&gt;從 Ubuntu 25.10 開始，系統預設使用 &lt;code&gt;sudo-rs&lt;/code&gt;。
使用者繼續輸入 &lt;code&gt;sudo&lt;/code&gt;，底層會執行 Rust 實現。&lt;/p&gt;
&lt;p&gt;傳統 sudo 並沒有馬上消失。
在 Ubuntu 的過渡設計中，經典 sudo 仍然以 &lt;code&gt;sudo-ws&lt;/code&gt; 的形式保留。
如果確實需要傳統實現，可以使用 &lt;code&gt;sudo-ws&lt;/code&gt;，或者透過 alternatives 機制切換預設 sudo。&lt;/p&gt;
&lt;p&gt;切換命令類似這樣：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo update-alternatives --config sudo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;不過，不建議普通使用者主動切回傳統 sudo。
如果你沒有自訂 sudoers，也沒有依賴特殊行為，繼續使用發行版預設選擇更省心。&lt;/p&gt;
&lt;p&gt;如果你想在舊版本 Ubuntu 上測試，&lt;code&gt;sudo-rs&lt;/code&gt; 從 Ubuntu 24.04 開始已經可以從 universe 倉庫獲得。
其他發行版也可能提供對應套件，但命令名稱和整合方式不一定相同。&lt;/p&gt;
&lt;h2 id=&#34;sudo-rs-為什麼選擇-rust&#34;&gt;sudo-rs 為什麼選擇 Rust
&lt;/h2&gt;&lt;p&gt;sudo 是高權限工具。
一旦這類工具出現漏洞，後果可能比普通命令嚴重得多。
歷史上，sudo 也出現過多個權限提升漏洞。&lt;/p&gt;
&lt;p&gt;Rust 的優勢在於記憶體安全。
它透過所有權、借用檢查和型別系統，減少懸空指標、越界存取、use-after-free 等常見問題。
這不能保證程式絕對安全，但可以減少 C/C++ 專案裡很常見的一類漏洞。&lt;/p&gt;
&lt;p&gt;對 sudo 這種長期執行在安全敏感位置的工具來說，用更安全的語言重寫有現實意義。
它不只是「為了 Rust 而 Rust」，而是試圖降低維護和稽核成本。&lt;/p&gt;
&lt;p&gt;當然，語言不能解決全部安全問題。
權限檢查邏輯、設定解析、PAM 互動、環境變數處理、日誌和使用者體驗，仍然需要嚴謹設計和長期測試。&lt;/p&gt;
&lt;h2 id=&#34;sudo-rs-不是唯一選擇&#34;&gt;sudo-rs 不是唯一選擇
&lt;/h2&gt;&lt;p&gt;sudo 生態裡本來就有其他替代品。&lt;/p&gt;
&lt;p&gt;比較常見的是 &lt;code&gt;doas&lt;/code&gt;。
它來自 OpenBSD，設計更簡單，設定也更小。
一些使用者喜歡它，是因為它沒有 sudo 那麼複雜。&lt;/p&gt;
&lt;p&gt;還有一些 Rust 或 systemd 相關的替代方案，例如 RootAsRole、systemd 的 &lt;code&gt;run0&lt;/code&gt; 等。
不過這些工具的目標和適用場景並不完全相同。&lt;/p&gt;
&lt;p&gt;對大多數 Linux 發行版來說，sudo 仍然是預設選擇。
&lt;code&gt;sudo-rs&lt;/code&gt; 的意義在於，它嘗試在保持使用者習慣的同時，把底層實現換成更現代的程式碼基礎。&lt;/p&gt;
&lt;h2 id=&#34;遷移前應該檢查什麼&#34;&gt;遷移前應該檢查什麼
&lt;/h2&gt;&lt;p&gt;如果你只是個人桌面使用者，可以跟隨發行版預設設定。&lt;/p&gt;
&lt;p&gt;如果你維護伺服器或工作站，建議檢查這些內容：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;是否有複雜的 &lt;code&gt;/etc/sudoers&lt;/code&gt; 或 &lt;code&gt;/etc/sudoers.d/&lt;/code&gt; 規則；&lt;/li&gt;
&lt;li&gt;是否使用了命令參數萬用字元；&lt;/li&gt;
&lt;li&gt;是否依賴 sudo 的郵件通知；&lt;/li&gt;
&lt;li&gt;是否有腳本解析 sudo 的錯誤輸出；&lt;/li&gt;
&lt;li&gt;是否透過 sudoers 控制 umask、資源限制或環境變數；&lt;/li&gt;
&lt;li&gt;是否有 LDAP、PAM、SSSD 等認證整合；&lt;/li&gt;
&lt;li&gt;是否有自動化部署腳本預設假設傳統 sudo 行為。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;可以先在測試機上驗證：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo -l
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再執行關鍵維護命令，確認權限、環境變數和日誌行為都符合預期。&lt;/p&gt;
&lt;h2 id=&#34;是否應該主動切換到-sudo-rs&#34;&gt;是否應該主動切換到 sudo-rs
&lt;/h2&gt;&lt;p&gt;如果發行版已經預設切換，普通使用者可以直接接受。
如果你使用的是伺服器或生產環境，不建議只為了嘗鮮手動替換。&lt;/p&gt;
&lt;p&gt;更穩妥的做法是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在測試環境安裝 &lt;code&gt;sudo-rs&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;對照現有 sudoers 設定逐項驗證；&lt;/li&gt;
&lt;li&gt;檢查 PAM、日誌、稽核和自動化腳本；&lt;/li&gt;
&lt;li&gt;確認回滾方式；&lt;/li&gt;
&lt;li&gt;等發行版給出穩定整合後再遷移。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;這類工具處在權限鏈路上，不適合用「能執行幾個命令」來判斷是否安全。
真正要驗證的是邊界條件和異常情況。&lt;/p&gt;
&lt;h2 id=&#34;小結&#34;&gt;小結
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;sudo-rs&lt;/code&gt; 是傳統 sudo 的 Rust 實現，目標是用更現代、更安全的程式碼基礎承接 sudo 的核心功能。
Ubuntu 25.10 預設啟用它，說明主流發行版已經開始認真推動這條路線。&lt;/p&gt;
&lt;p&gt;對普通使用者來說，變化很小。
你仍然輸入 &lt;code&gt;sudo&lt;/code&gt;，只是底層實現可能變成了 &lt;code&gt;sudo-rs&lt;/code&gt;。
最多會注意到密碼輸入顯示星號，或者錯誤提示文字略有變化。&lt;/p&gt;
&lt;p&gt;對系統管理員來說，重點是相容性。
如果系統裡有複雜 sudoers 規則、sendmail 通知、PAM 整合、參數萬用字元或依賴 sudo 輸出的腳本，就應該在升級前測試。&lt;/p&gt;
&lt;p&gt;Rust 重寫不是萬靈丹，但對 sudo 這種安全敏感工具來說，減少記憶體安全風險、降低維護複雜度，是值得認真考慮的方向。&lt;/p&gt;
&lt;p&gt;參考來源：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://itsfoss.com/sudo-vs-sudo-rs/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;It&amp;rsquo;s FOSS：sudo vs sudo-rs: What You Need to Know&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://github.com/trifectatechfoundation/sudo-rs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;sudo-rs GitHub 專案&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
