この質問はすでに Stack Overflow で行っていましたが、ここに投稿するように求められました。同じことをしています。
私はこのコマンドをmy Java program-
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で変更を加えることなく、つまりデフォルト設定を使用することで、上記のコマンドを実行することは可能ですか??
Java=でシェルコマンドを実行する方法がわかりませんが、sshコマンドの-tオプションを確認してください
-t force pseudo-tty allocation.
Ssh経由でrootとしてコマンドを実行する必要がある場合は、これを行います(直接rootログインの無効化とSudoで必要なtty)
私の質問は、上記のコマンドをJavaで実行することは可能ですか?デフォルトの設定を使用することによって、どこにも変更を加えることなく?
Sudo -u -S pwd
簡単な答えは「いいえ」です。Sudoで現在とは異なる方法で処理を行うには、設定を変更する必要があります。
Sudoはこのための間違ったツールである可能性があります。 Sudoのルールは、システム管理者が悪用して追加/意図しない特権を取得することが難しい昇格特権を取得する方法を構成するのに役立ちます。
Sudoがあなたのために何をするかを考えれば:
Javaで任意のコマンドを任意のユーザーとして実行し、それらのユーザーまたは自分のパスワードを提供しない場合は、基本的にSudoを置き換えます。その場合は、独自のルールを作成して、乱用。
これを行うには、基本的に2つの方法があります。
#1の場合、あなたのJavaプログラムはSudoが行うこと自体を実行しているので、悪用から保護するために独自のルールセットを実装する必要があります。
#2を実行するSudo以外のプログラムがあります。 https://code.google.com/archive/p/exec-wrapper/downloads に1つの例があります。
この便利なシェルスクリプトは、別のコマンド(通常はスクリプト)を実行するCプログラムを作成します。次に、Cプログラムをバイナリにコンパイルし、そのsetuidルートをマークするか、実際には任意のユーザーにsetuidできるようにします。 (モード:4555、所有者:root)
それを許可するファイルシステムを使用している限り、バイナリプログラムを実行すると、構成されたコマンドがバイナリプログラム自体を所有するユーザーIDとして実行されます。