抱歉,您必須有 tty 才能運行 sudo

抱歉,您必須有 tty 才能運行 sudo

我已經問過這個問題了堆疊溢位,但我被要求將其發佈在這裡。所以也做同樣的事情。

我使用我的 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 對您的作用:

  1. 提示輸入密碼以驗證身份
  2. 提升特權
  3. 然後可選擇以其他使用者身分取得權限
  4. 記錄 sudo 用於獲取存取權限或運行命令的信息

如果您希望您的 java 以任意使用者身分執行任意命令,而不為這些使用者或您自己的使用者提供密碼,那麼您實際上是在替換 sudo。在這種情況下,您應該建立自己的規則來防止濫用。

基本上有兩種方法可以做到這一點:

  1. 使用提升的權限來執行 java,並小心地取得和返還所需的權限(請參閱 setuid() seteuid() C 函數呼叫)。
  2. 執行外部程式以在需要時取得提升的權限

在#1 的情況下,您的 java 程式正在執行 sudo 所做的事情,您應該實作自己的一組規則以防止濫用。

除了 sudo 之外,還有其他程式可以執行#2。一個例子可以在https://code.google.com/archive/p/exec-wrapper/downloads

這個方便的 shell 腳本會建立一個 C 程式來執行另一個命令(通常是腳本)。然後將 C 程式編譯為二進位檔案並標記該 setuid root,或者實際上它可以為任何使用者設定 uid。 (模式:4555 所有者:root)

只要您所在的檔案系統允許,執行二進位程式就會以擁有二進位程式本身的使用者 ID 身分執行設定的命令。

相關內容