
我已經問過這個問題了堆疊溢位,但我被要求將其發佈在這裡。所以也做同樣的事情。
我使用我的 java 程式運行了這個命令-
sudo -u <username> -S pwd
我得到這個輸出-
command=sudo -u <username> -S pwd
exitCode=1
sudo: sorry, you must have a tty to run sudo
我嘗試編輯 /etc/sudoers 但它已經包含
<username> ALL=(ALL) NOPASSWD: ALL
然後,我了解到可以透過在 /etc/sudoers 中註解掉以下程式碼來完成此操作
# Defaults requiretty
另外,預設情況下,當嘗試使用其他使用者身分執行命令時sudo
,我們必須提供自己的密碼。但這可以透過在 /etc/sudoers 中進行以下更改來更改 -
Defaults targetpw
我的問題是,是否可以在 java 中執行上面的命令而不在任何地方進行任何更改,即透過預設設定?
答案1
我不知道如何在 Java 中運行 shell 命令,但看看 ssh 命令的 -t 選項
-t force pseudo-tty allocation.
這就是當我需要透過 ssh 以 root 身分執行命令時我所做的(直接 root 登入禁用和 sudo 所需的 tty)
答案2
我的問題是,是否可以在 java 中執行上述命令而不在任何地方進行任何更改,即透過預設設定?
sudo -u -S 密碼
簡而言之,答案是否定的,您需要更改設定以使 sudo 執行與當前不同的操作。
sudo 可能是錯誤的工具。 Sudo 的規則可以幫助系統管理員配置一種取得權限提升的方法,這種方法很難被濫用以獲得額外/意外的權限。
如果您考慮 sudo 對您的作用:
- 提示輸入密碼以驗證身份
- 提升特權
- 然後可選擇以其他使用者身分取得權限
- 記錄 sudo 用於獲取存取權限或運行命令的信息
如果您希望您的 java 以任意使用者身分執行任意命令,而不為這些使用者或您自己的使用者提供密碼,那麼您實際上是在替換 sudo。在這種情況下,您應該建立自己的規則來防止濫用。
基本上有兩種方法可以做到這一點:
- 使用提升的權限來執行 java,並小心地取得和返還所需的權限(請參閱 setuid() seteuid() C 函數呼叫)。
- 執行外部程式以在需要時取得提升的權限
在#1 的情況下,您的 java 程式正在執行 sudo 所做的事情,您應該實作自己的一組規則以防止濫用。
除了 sudo 之外,還有其他程式可以執行#2。一個例子可以在https://code.google.com/archive/p/exec-wrapper/downloads
這個方便的 shell 腳本會建立一個 C 程式來執行另一個命令(通常是腳本)。然後將 C 程式編譯為二進位檔案並標記該 setuid root,或者實際上它可以為任何使用者設定 uid。 (模式:4555 所有者:root)
只要您所在的檔案系統允許,執行二進位程式就會以擁有二進位程式本身的使用者 ID 身分執行設定的命令。