web-dev-qa-db-ja.com

すみません、sudoを実行するにはttyが必要です

この質問はすでに 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で変更を加えることなく、つまりデフォルト設定を使用することで、上記のコマンドを実行することは可能ですか?

13
AlwaysALearner

Java=でシェルコマンドを実行する方法がわかりませんが、sshコマンドの-tオプションを確認してください

-t force pseudo-tty allocation.

Ssh経由でrootとしてコマンドを実行する必要がある場合は、これを行います(直接rootログインの無効化とSudoで必要なtty)

3
Ask and Learn

私の質問は、上記のコマンドをJavaで実行することは可能ですか?デフォルトの設定を使用することによって、どこにも変更を加えることなく?

Sudo -u -S pwd

簡単な答えは「いいえ」です。Sudoで現在とは異なる方法で処理を行うには、設定を変更する必要があります。

Sudoはこのための間違ったツールである可能性があります。 Sudoのルールは、システム管理者が悪用して追加/意図しない特権を取得することが難しい昇格特権を取得する方法を構成するのに役立ちます。

Sudoがあなたのために何をするかを考えれば:

  1. 身元を確認するためのパスワードを要求する
  2. 特権を昇格させる
  3. 次に、オプションで別のユーザーとして特権を取得します
  4. sudoがアクセスまたはコマンドの実行に使用するログ

Javaで任意のコマンドを任意のユーザーとして実行し、それらのユーザーまたは自分のパスワードを提供しない場合は、基本的にSudoを置き換えます。その場合は、独自のルールを作成して、乱用。

これを行うには、基本的に2つの方法があります。

  1. 昇格した特権でJavaを実行し、必要な特権を慎重に取り戻します(setuid()、seteuid()C関数呼び出しを参照)。
  2. 外部プログラムを実行して、必要なときにシステム特権を取得する

#1の場合、あなたのJavaプログラムはSudoが行うこと自体を実行しているので、悪用から保護するために独自のルールセットを実装する必要があります。

#2を実行するSudo以外のプログラムがあります。 https://code.google.com/archive/p/exec-wrapper/downloads に1つの例があります。

この便利なシェルスクリプトは、別のコマンド(通常はスクリプト)を実行するCプログラムを作成します。次に、Cプログラムをバイナリにコンパイルし、そのsetuidルートをマークするか、実際には任意のユーザーにsetuidできるようにします。 (モード:4555、所有者:root)

それを許可するファイルシステムを使用している限り、バイナリプログラムを実行すると、構成されたコマンドがバイナリプログラム自体を所有するユーザーIDとして実行されます。

1
Mr. Ice