假設我們有兩個使用者:alex 和 alexa。我們希望允許 alexhtop
以 root 身份執行,以便查看磁碟使用情況統計信息,但我們不希望他們看到 root 可以執行的其他用戶進程。然後需要允許他們以自己的用戶名作為標誌htop
執行-u
(重要提示:正如@HBruijn所提到的,指定使用者標誌htop
並不會阻止執行器透過U鍵更改使用者過濾器;讓我們假設該標誌確實限制了執行器來說明問題)。但我們還需要檢查最後指定的-u
參數是否為alex
,而且我們不想強制它成為最後指定的參數。正規表示式如下:
^.*(--user=alex|-u alex)\b((?!-u).)*$
^
表示字串開始(--user=alex|-u alex)
-u
-參數的捕獲組\b
- 單字邊界(因此 alex 無法指定-u alexa
)((?!-u).)*
-u
- 負向先行,在有效的 (-u alex
) 通過後拒絕任何通過
我們將其寫入文件/etc/sudoers
:
echo "alex ALL=(ALL) NOPASSWD: /usr/bin/htop ^.*(--user=alex|-u alex)\b((?!-u).)*$" >> /etc/sudoers
然而,當 alex 嘗試執行普通命令時,sudo 拒絕了它們:
$ sudo /usr/bin/htop -u alex
[sudo] password for alex:
Sorry, user alex is not allowed to execute '/usr/bin/htop -u alex' as root on machine.
透過檢查 regexp 時egrep
(sudo 文件指出它類似於透過 regexp 驗證字串的方式),它按預期工作:
$ echo '-u alex' | egrep '^.*(--user=alex|-u alex)\b((?!-u).)*$'
-u alex
是什麼導致 sudo 忽略該匹配的行為?使用Ubuntu 22.04,Sudo 1.9.14p3。