web-dev-qa-db-ja.com

エコーせずにシェルスクリプトからパスワードを取得する方法

パスワードで保護されたシステムにアクセスする必要があるプロセスを自動化するスクリプトがあります。システムには、ユーザーパスワードを引数として受け付けるコマンドラインプログラムを介してアクセスします。

自分のパスワードを入力し、それをShell変数に割り当ててから、その変数を使用してアクセスプログラムのコマンドラインを作成するようにユーザーに促します(もちろん、処理するストリーム出力が生成されます)。

私はBourne/Bashの中ではかなり有能なShellプログラマーですが、端末にエコーさせずに(または '*'文字を使ってエコーさせずに)ユーザー入力を受け入れる方法がわかりません。

誰もがこれを手伝ってくれる?

352
BD at Rivenhill

これを行う別の方法は次のとおりです。

#!/bin/bash
# Read Password
echo -n Password: 
read -s password
echo
# Run Command
echo $password

read -sはエコーをオフにします。最後の行のechoを実行したいコマンドに置き換えるだけです。

528
wsware

POSIX準拠の答えです。 /bin/shの代わりに/bin/bashを使用していることに注目してください。 (bashでは動作しますが、requirebashは動作しません。)

#!/bin/sh
stty -echo
printf "Password: "
read PASSWORD
stty echo
printf "\n"
170
thecloud

ワンライナー:

read -s -p "Password: " password

Linux(およびcygwin)では、この形式はbashとshで機能します。ただし、標準のUNIX shではないかもしれません。

より多くの情報とオプションについては、bashで "help read"とタイプしてください。

$ help read
read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p Prompt] [-t timeout] [-u fd] [name ...]
Read a line from the standard input and split it into fields.
  ...
  -p Prompt output the string Prompt without a trailing newline before
            attempting to read
  ...
  -s                do not echo input coming from a terminal
72
smendola

read-sオプションはPOSIX規格では定義されていません。 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/read.html を参照してください。私はどんなPOSIXシェルでも動くものが欲しいので、エコーを無効にするためにsttyを使う小さな関数を書きました。

#!/bin/sh

# Read secret string
read_secret()
{
    # Disable echo.
    stty -echo

    # Set up trap to ensure echo is enabled before exiting if the script
    # is terminated while echo is disabled.
    trap 'stty echo' EXIT

    # Read secret.
    read "$@"

    # Enable echo.
    stty echo
    trap - EXIT

    # Print a newline because the newline entered by the user after
    # entering the passcode is not echoed. This ensures that the
    # next line of output begins at a new line.
    echo
}

この関数はreadコマンドと非常によく似た動作をします。これはreadの簡単な使い方とそれに続くread_secretの使い方です。 read_secretへの入力は、端末にエコーされていないため、空に見えます。

[susam@cube ~]$ read a b c
foo \bar baz \qux
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[susam@cube ~]$ unset a b c
[susam@cube ~]$ read_secret a b c

[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=bar c=baz qux
[susam@cube ~]$ unset a b c

これは-rオプションを使って入力中のバックスラッシュを保存する別のものです。上で定義されたread_secret関数が受け取るすべての引数をreadコマンドに渡すので、これはうまくいきます。

[susam@cube ~]$ read -r a b c
foo \bar baz \qux
[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[susam@cube ~]$ unset a b c
[susam@cube ~]$ read_secret -r a b c

[susam@cube ~]$ echo a=$a b=$b c=$c
a=foo b=\bar c=baz \qux
[susam@cube ~]$ unset a b c

最後に、これはread_secret関数を使用してPOSIX準拠の方法でパスワードを読み取る方法を示す例です。

printf "Password: "
read_secret password
# Do something with $password here ...
47
Susam Pal

私は便利なaskpassコマンドであることがわかりました

password=$(/lib/cryptsetup/askpass "Give a password")

すべての入力文字は*に置き換えられます。参照項目:パスワードの入力****

11
Manuel

echo を使用してsttyをオフにしてから、もう一度オンにします。

次のようにして、現在のシェルで変数を設定せずにパスワードの入力を求めることもできます。

$(read -s;echo $REPLY)

例えば:

my-command --set password=$(read -sp "Password: ";echo $REPLY)

これを行うには、これらのプロンプト値のいくつかを改行で追加できます。

my-command --set user=$(read -sp "`echo $'\n '`User: ";echo $REPLY) --set password=$(read -sp "`echo $'\n '`Password: ";echo $REPLY)
1
Pascal Chardon

このリンクは、*端末にエコーバックせずに使用からパスワードを読み取る方法*各文字を*文字で置き換える方法を定義するのに役立ちます。

https://www.tutorialkart.com/bash-Shell-scripting/bash-read-username-and-password/

0
Hassan Farid