ユーザーにパスワードを要求するコマンドを実行するUNIXシェル関数を作成しています。パスワードをスクリプトにハードコーディングして、コマンドに提供したい。次のようにパスワードをコマンドにパイプしてみました:
function() {
echo "password" | command
}
パスワードの入力を求める前にコマンドが入力バッファをフラッシュする可能性があるため、これは一部のコマンドでは機能しない場合があります。
また、標準入力を次のようなパスワードを含むファイルにリダイレクトしようとしましたが、それも機能しません。
function() {
echo "password" > pass.tmp
command < pass.tmp
rm pass.tmp
}
一部のコマンドではパスワードを引数として指定できることは知っていますが、標準入力を使用したいです。
私は、パスワードをbashのコマンドにパイプする迅速で汚い方法を探しています。
autoexpect
をご覧ください(まともなチュートリアル [〜#〜] here [〜#〜] ) 。それはあなたがトリックを使わずに得ることができるのと同じくらい迅速かつ汚いです。
autoexpectを使用してパスワードをコマンドにパイプする方法
これらの手順は、Ubuntu 12.10デスクトップで示されています。ディストリビューションの正確なコマンドはわずかに異なる場合があります。
Autoexpectスクリプトファイルを読み取ることができるすべてのユーザーに使用するパスワードを公開する危険があるため、これは危険です。
Rootパスワードまたはパワーユーザーパスワードは、このように期待値をパイプ処理して公開しないでください。ルートキットはすぐにこれを見つけ、あなたの箱が所有されます。
EXPECTはプロセスを生成し、入ってくるテキストを読み取ってから、スクリプトファイルで事前定義されたテキストを送信します。
expect
とautoexpect
がインストールされていることを確認してください:
Sudo apt-get install expect
Sudo apt-get install expect-dev
それについて読んでください:
man expect
man autoexpect
ホームディレクトリに移動します。
cd /home/el
ユーザーel
はファイルをルートにchownできず、パスワードを入力する必要があります。
touch testfile.txt
Sudo chown root:root testfile.txt
[enter password to authorize the changing of the owner]
これは、自動化するパスワードエントリです。端末を再起動して、Sudoからパスワードの再入力を求められるようにします。もう一度/ home/elに移動して、これを実行します。
touch myfile.txt
autoexpect -f my_test_expect.exp Sudo chown root:root myfile.txt
[enter password which authorizes the chown to root]
autoexpect done, file is my_test_expect.exp
my_test_expect.exp
ファイルを作成しました。スーパーシークレットパスワードは、このファイルにプレーンテキストで保存されます。これは非常に不快になります。許可と所有権をできるだけ制限することにより、不快感を軽減します。
Sudo chown el my_test_expect.exp //make el the owner.
Sudo chmod 700 my_test_expect.exp //make file only readable by el.
my_test_expect.exp
の下部に次の種類のコマンドが表示されます。
set timeout -1
spawn Sudo chown root:root myfile.txt
match_max 100000
expect -exact "\[Sudo\] password for el: "
send -- "YourPasswordStoredInPlaintext\r"
expect eof
上記のexpectコマンドが適切であることを確認する必要があります。 autoexpectスクリプトが過度に敏感であるか、十分に敏感でない場合、ハングします。この場合、期待されるのは常に到着するテキストを待っているためです。
ユーザーelとしてexpectスクリプトを実行します。
expect my_test_expect.exp
spawn Sudo chown root:root myfile.txt
[Sudo] password for el:
My_test_expect.expに含まれるパスワードは、ユーザーelによってchownにrootにパイプされました。パスワードが受け入れられたかどうかを確認するには、myfile.txt
を見てください:
ls -l
-rw-r--r-- 1 root root 0 Dec 2 14:48 myfile.txt
これはrootであり、elがパスワードを入力したことがないため機能しました。このスクリプトでルート、Sudo、またはパワーユーザーのパスワードを公開すると、ボックスでルートを簡単に取得できます。これは、誰も質問することのないセキュリティシステムにとってのペナルティです。
安全なコマンドではこれが許可されないので、当然のことながら、私は恐れています。トラックを運転できるセキュリティホールです。
入力リダイレクト、コマンドラインパラメーター、または構成ファイルを使用したコマンドが許可されていない場合、深刻な策略に頼らなければなりません。
一部のアプリケーションは実際に開きます/dev/tty
セキュリティを破るのに苦労するようにします。あなたcan一時的に/dev/tty
(たとえば、独自のパイプを作成する)が、これには重大な特権が必要であり、itを無効にすることもできます。
-S
フラグを使用して、std入力から読み取ることができます。以下の例をご覧ください。
function shutd()
{
echo "mySuperSecurePassword" | Sudo -S shutdown -h now
}
パスワードの入力を求めるプログラムは通常、ttyを「raw」モードに設定し、ttyから直接入力を読み取ります。サブプロセスをptyで生成すると、それを機能させることができます。それがExpectのすることです...
単に使用します:
echo "password" | Sudo -S mount -t vfat /dev/sda1 /media/usb/;
if [ $? -eq 0 ]; then
echo -e '[ ok ] Usb key mounted'
else
echo -e '[warn] The USB key is not mounted'
fi
このコードは私のために働いており、/ etc/init.d/myscriptbash.shにあります