申し訳ありませんが、sudo を実行するには tty が必要です

申し訳ありませんが、sudo を実行するには tty が必要です

私はすでにこの質問をしていましたスタックオーバーフローですが、ここに投稿するように依頼されました。なので、同じようにします。

私は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でシェルコマンドを実行する方法はわかりませんが、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 を置き換えることになります。その場合は、不正使用を防ぐための独自のルールを作成する必要があります。

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

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

1 の場合、Java プログラムは sudo と同じことを実行するため、悪用を防ぐために独自のルール セットを実装する必要があります。

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

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

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

関連情報