我正在一台沒有 root 權限的機器上工作,但有一個允許的sudo
命令清單。這些命令之一是/bin/su - foouser
.這樣我就可以輸入sudo su - foouser
,並獲得一個名為 foouser 的互動式 shell。然後我可以運行一些東西foouser
。
問題在於,這foouser
是一個共享使用者/shell,用於產生某些重要的生產過程。我無法輕鬆地自訂它或按照我想要的方式設定它。而且我不應該一直在其中工作,這會分割我的終端,以及我以我自己身分登入的終端和我所在的終端之間的命令歷史記錄foouser
。
我真正想做的是有一種方法來運行單一命令foouser
,讓它阻塞,像命令通常那樣將 stdout 和 stderr 列印到我的 shell,然後返回,我仍然以我自己的身份登入(並且不是foouser
)。例如,這可以封裝在一個腳本中,以便as_foo bar
執行命令bar
as foouser
,列印 stdout 和 stderr,返回返回程式碼bar
,然後將我放回 shell 中。
我可以要求系統管理員更改權限。例如,他們可以添加bar
到 sudo 列表,然後我可以使用(我認為)su -c
以我描述的方式運行 bar。但如果第二天我想跑步bar2
,我就必須再和他們交談。
有沒有辦法擺脫這個困境呢?這看起來相當愚蠢,因為我顯然可以成為foouser
並運行任意數量的命令,因此我可以看到安全性方面沒有任何區別。只是找不到任何明顯方便的方法來實現這一點。
答案1
sudo su - foouser <command>
要求您至少具有有限的 root 存取權才能su - foouser <command>
以 root 身分執行。
sudo -u foouser <command>
可以一步完成你想要的事情。但它要求系統管理員已授予您透過以下方式sudo
存取帳戶的權限:foouser
ignacio ALL=(foouser) ALL
而不是這樣:
ignacio ALL=(root) su - foouser
以這種方式配置sudo
將允許您定義例如您設想的別名:
as_foo='sudo -u foouser'
透過避免su -
,您也許能夠繼續使用自己的自訂設定:以sudo
這種方式使用僅更改使用者身份,但保持HOME
其先前的值,讀取任何 shell 啟動腳本和其他自訂設置你的主目錄而不是foouser
's。
(當然,這些腳本也必須可供其他使用者讀取,並且您可能運行的任何共享腳本最好foouser
明確引用 的主目錄,而/home/foouser
不僅僅是$HOME
。)
但是,有一些sudo
設定可能會阻止該解決方案工作:如果always_set_home
在 sudoers 檔案中設定了 sudo 選項,或者env_reset
設定了選項但未新增HOME
到env_keep
清單中,HOME
則無論如何都會重設。在這種情況下,請嘗試-E
為sudo
命令新增選項以明確要求保留您的環境。
當您確實想要執行foouser
與登入時完全一樣的環境設定foouser
(即相當於sudo su - foouser
)時,請新增該-i
選項以專門請求該選項。sudo -i -u foouser
100% 準確的替換也是如此sudo su - foouser
。
如果您發現某些系統的舊版本sudo
沒有該-i
選項,請使用該-H
選項與 sudo 代替:它不是完美的替代品,但可能就足夠了。這樣的舊版本sudo
很可能也會存在一些安全敏感的已知錯誤,因此無論如何更新它都是值得的。
您可以使用sudo -l
as 您自己來查看您的 sudo 存取權限是如何定義的以及哪些 sudo 選項(也稱為預設條目)對您有效。
答案2
將附加參數傳遞給su
.
sudo su - foouser sh -c 'echo $USER'