3

出力ストリームでパスワードを送信して、LinuxのユーザーパスワードをJavaプログラムから変更しようとしていますが、変更されていません。

私のJavaプログラムは

Process process = Runtime.getRuntime().exec("sudo passwd sampleuser");

OutputStream outputStream = process.getOutputStream();

InputStream inputStream = process.getInputStream();

PrintWriter printWriter=new PrintWriter(outputStream);

printWriter.write("123456");

printWriter.write("\n");

printWriter.flush();

私のプログラムはここで失敗し、パスワードを要求しますが、この場合は望ましくありません。

Javaプログラムからパスワードを提供する可能性はありますか?あなたは私にそれをどのように成功させるか、またはそれのために利用可能なシェルAPIがありますか?

シェルスクリプトを使用してJavaプログラムから呼び出すと、同じことが成功します。

Process process = Runtime.getRuntime().exec("bash first.sh");

私のシェルスクリプトは

i="123456"

echo -e $i"\n"$i|sudo -S passwd sampleuser

ユーザーパスワードを正常に変更します。

4

3 に答える 3

5

パスワードを要求されます。シェルスクリプトを見てください。スーパー ユーザー権限を要求するコマンドを実行します ( sudo)。スーパーユーザーとして実行しない限り、プログラムはパスワードの入力を求めます。

シェルスクリプトを分解するには:

i="123456"

echo -e $i"\n"$i|sudo -S passwd sampleuser

sudo -S意味 :

-S (stdin) オプションを指定すると、sudo は端末デバイスではなく標準入力からパスワードを読み取るようになります。パスワードの後に​​は改行文字が必要です。

そして、それがあなたのスクリプトが行っていることであり、 asに password( passwd) を設定しています。そして、あなたが使用しているので、すでに変数を与えている標準入力から読み取っています。そして、あなたはこれらすべてをスーパーユーザーとして行っています! 心に留めておきます。sampleuseri-Si

ここで、Java プログラムを振り返り、それに応じて変更を試みます。プログラムを実行するときにスーパー ユーザー権限を持っていますか? いいえ、あなたはしません。

于 2012-06-01T07:39:35.023 に答える
0

誰かが答えを探している場合、私は次の行で方法を見つけます:

try {
    Process p = Runtime.getRuntime().exec(new String[] {"sudo", "/bin/sh", "-c", "echo \"user:newpassword\" | sudo chpasswd"} );
    p.waitFor();
} catch (IOException | InterruptedException e1) {
    e1.printStackTrace();
}
于 2017-05-18T14:11:06.783 に答える