Bashスクリプトで画面に表示せずにパスワードを読み取る


20

端末に表示されていないツールのような方法でbashスクリプトのパスワードを読み取る方法は?

(フォントを黒から黒に変更するのは、コピー&ペーストが簡単なため難しい場合があります-それは解決策ではありません)


3
これを読んでいる人には:エコーをオンにしてブラックオンブラックのパスワードを読まないでください。パスワードは引き続き送信され、端末が使用した端末ディレクティブを知らない場合、文字は視覚的にエコーします。エコーをオフにします。使用termiossttyread -s、それをしないもの。
-Alexios

それが解決策ではないと書いた理由です;)。
グジェゴシWierzowiecki

確かに!時々、質問をざっと読んで、見当違いの結論に至ることがあります。:)
アレクシオス

回答:


30

からhelp read

-s        do not echo input coming from a terminal

1
すごい。私man readには書かれていません、私はチェックインしていませんhelp read。知っておくといい。
グジェゴシWierzowiecki

3
@GrzegorzWierzowiecki:間違ったマニュアルを見ています。つまりman bash、bashのマニュアルを読む必要があり、そこに-sオプションがありますSilent mode. If input is coming from a terminal, characters are not echoed.
-pradeepchhetri

5

私はいつもstty -echoエコーをオフにしてから読み、その後読みましたstty echostty-のmanを見るともっと読みますman stty)。エコーをオフにして、標準の標準入力「リーダー」でJava、C(++)、Pythonなどのプログラミング言語からパスワードを読み取ることができるため、これはプログラマーの観点からより便利です。

bashでは、使用法は次のようになります。

echo -n "USERNAME: "; read uname
echo -n "PASSWORD: "; stty -echo; read passwd; stty echo; echo
program $uname $passwd
passwd= # get rid of passwd

たとえば、Pythonは次のようになります。

from sys import stdout
from os import system as term

uname = raw_input("USERNAME: ") # read input from stdin until [Enter] in 2
stdout.write("PASSWORD: ")
term("stty -echo") # turn echo off
try:
    passwd = raw_input()
except KeyboardInterrupt: # ctrl+c pressed
    raise SystemExit("Password attempt interrupted")
except EOFError: # ctrl+d pressed
    raise SystemExit("Password attempt interrupted")
finally:
    term("stty echo") # turn echo on again

print "username:", uname
print "password:", "*" * len(passwd)

私はこれをPythonで何度もしなければならなかったので、その観点からかなりよく知っています。ただし、他の言語に翻訳するのはそれほど難しくありません。


-1

あなたの質問は、「ツールのような方法で」ある種の異なるものです。したがって、これがあなたのために働くかどうかは正確にはわかりません:

system1 $ passwd=abc123
system1 $ printf "%s\n" "${passwd//?/*}"
******
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.