web-dev-qa-db-ja.com

bashでパスワードを要求するコマンドにパスワードを提供する方法は?

ユーザーにパスワードを要求するコマンドを実行するUNIXシェル関数を作成しています。パスワードをスクリプトにハードコーディングして、コマンドに提供したい。次のようにパスワードをコマンドにパイプしてみました:

function() {
    echo "password" | command
}

パスワードの入力を求める前にコマンドが入力バッファをフラッシュする可能性があるため、これは一部のコマンドでは機能しない場合があります。

また、標準入力を次のようなパスワードを含むファイルにリダイレクトしようとしましたが、それも機能しません。

function() {
    echo "password" > pass.tmp
    command < pass.tmp
    rm pass.tmp
}

一部のコマンドではパスワードを引数として指定できることは知っていますが、標準入力を使用したいです。

私は、パスワードをbashのコマンドにパイプする迅速で汚い方法を探しています。

37
Nate W.

autoexpectをご覧ください(まともなチュートリアル [〜#〜] here [〜#〜] ) 。それはあなたがトリックを使わずに得ることができるのと同じくらい迅速かつ汚いです。

20
SiegeX

autoexpectを使用してパスワードをコマンドにパイプする方法

これらの手順は、Ubuntu 12.10デスクトップで示されています。ディストリビューションの正確なコマンドはわずかに異なる場合があります。

Autoexpectスクリプトファイルを読み取ることができるすべてのユーザーに使用するパスワードを公開する危険があるため、これは危険です。

Rootパスワードまたはパワーユーザーパスワードは、このように期待値をパイプ処理して公開しないでください。ルートキットはすぐにこれを見つけ、あなたの箱が所有されます。

EXPECTはプロセスを生成し、入ってくるテキストを読み取ってから、スクリプトファイルで事前定義されたテキストを送信します。

  1. expectautoexpectがインストールされていることを確認してください:

    Sudo apt-get install expect
    Sudo apt-get install expect-dev
    
  2. それについて読んでください:

    man expect
    man autoexpect
    
  3. ホームディレクトリに移動します。

    cd /home/el
    
  4. ユーザーelはファイルをルートにchownできず、パスワードを入力する必要があります。

    touch testfile.txt
    Sudo chown root:root testfile.txt 
       [enter password to authorize the changing of the owner]
    
  5. これは、自動化するパスワードエントリです。端末を再起動して、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
    
  6. 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.
    
  7. 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
    
  8. 上記のexpectコマンドが適切であることを確認する必要があります。 autoexpectスクリプトが過度に敏感であるか、十分に敏感でない場合、ハングします。この場合、期待されるのは常に到着するテキストを待っているためです。

  9. ユーザーelとしてexpectスクリプトを実行します。

    expect my_test_expect.exp 
    spawn Sudo chown root:root myfile.txt
    [Sudo] password for el: 
    
  10. 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、またはパワーユーザーのパスワードを公開すると、ボックスでルートを簡単に取得できます。これは、誰も質問することのないセキュリティシステムにとってのペナルティです。

32
Eric Leschinski

安全なコマンドではこれが許可されないので、当然のことながら、私は恐れています。トラックを運転できるセキュリティホールです。

入力リダイレクト、コマンドラインパラメーター、または構成ファイルを使用したコマンドが許可されていない場合、深刻な策略に頼らなければなりません。

一部のアプリケーションは実際に開きます/dev/ttyセキュリティを破るのに苦労するようにします。あなたcan一時的に/dev/tty(たとえば、独自のパイプを作成する)が、これには重大な特権が必要であり、itを無効にすることもできます。

6
paxdiablo

-Sフラグを使用して、std入力から読み取ることができます。以下の例をご覧ください。

function shutd()
{
  echo "mySuperSecurePassword" | Sudo -S shutdown -h now
}    
6
Roozbeh

パスワードの入力を求めるプログラムは通常、ttyを「raw」モードに設定し、ttyから直接入力を読み取ります。サブプロセスをptyで生成すると、それを機能させることができます。それがExpectのすることです...

2
Keith

単に使用します:

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にあります

1
Alex Bins