1. ホーム
  2. php

[解決済み] PHPでのコマンドラインパスワードプロンプト

2023-08-06 02:26:20

質問

自分のウェブアプリを助けるためにコマンドラインツールを書いています。サービスに接続するためにパスワードが必要です。私は、コマンドライン引数としてそれを渡す必要がないように、スクリプトがパスワードプロンプトを表示することを望みます。

それは十分に簡単ですが、パスワードが入力されたときに画面にエコーしないようにしたいです。PHPでこれを行うにはどうしたらよいでしょうか?

純粋なPHPでそれを行うためのボーナスポイント( system('stty') で置き換えています。 * .

EDITです。

このスクリプトは、unix 系のシステム(linux や mac)上で動作する予定です。スクリプトはPHPで書かれており、おそらくこのままでしょう。

また、記録として stty のやり方は

echo "Password: ";
system('stty -echo');
$password = trim(fgets(STDIN));
system('stty echo');
// add a new line since the users CR didn't echo
echo "\n";

はないほうがいいですね。 system() の呼び出しがないほうがいい。

どのように解決するのですか?

以下のサイトで サイトポイント .

function prompt_silent($prompt = "Enter Password:") {
  if (preg_match('/^win/i', PHP_OS)) {
    $vbscript = sys_get_temp_dir() . 'prompt_password.vbs';
    file_put_contents(
      $vbscript, 'wscript.echo(InputBox("'
      . addslashes($prompt)
      . '", "", "password here"))');
    $command = "cscript //nologo " . escapeshellarg($vbscript);
    $password = rtrim(shell_exec($command));
    unlink($vbscript);
    return $password;
  } else {
    $command = "/usr/bin/env bash -c 'echo OK'";
    if (rtrim(shell_exec($command)) !== 'OK') {
      trigger_error("Can't invoke bash");
      return;
    }
    $command = "/usr/bin/env bash -c 'read -s -p \""
      . addslashes($prompt)
      . "\" mypassword && echo \$mypassword'";
    $password = rtrim(shell_exec($command));
    echo "\n";
    return $password;
  }
}