パイプ(またはサブシェル?)の後にprintfを表示する

パイプ(またはサブシェル?)の後にprintfを表示する

まあ、これは私がどのように解決するかによって異なりますので、質問で洗練するのは難しいです。

次のスクリプトは、3つのパスワードのパスワードを要求するwhileループにmount.cifsコマンドをパイプするように設計されています。注釈付きブロックは、プロンプトに応答しないという事実をデバッグしようとします。

#!/bin/bash

printf "How many atoms are there in the universe?\nAnswer:"
read -s $pwd
echo -e "\nThanks.\n"
while read prompt ; do
#     printf "prompt = $prompt" > /dev/stdout
#     ${prompt//"\n"/"\\n"}
#     printf "prompt is" >foo
    if [ "$prompt" = "Password: " ]; then
    echo -e "$pwd\r\n" > /dev/stdin
    fi
done < <(
    sudo mount.cifs "//192.168.1.2/My Music" /home/pi/Desktop/Music -o     user=Rob_
    sudo mount.cifs "//192.168.1.2/My Videos" /home/pi/Desktop/Videos -o     user=Rob_
    sudo mount.cifs "//192.168.1.2/My Pictures" /home/pi/Desktop    /Pictures -o user=Rob_
)

"prompt"変数が条件を満たしていないようですが、手動で/ dev / stdoutにリダイレクトした後でも、デバッグ出力は飲み込まれます。

誰かが少なくともこの状況でデバッグ情報を印刷する方法を教えてくれれば幸いです。そして、彼らがこの問題を完全に解決する方法(好ましくは私が望む方法を通して)を教えたい場合は、もっと知りたいです。エレガントですね、ぜひ見たいです) では私も感謝します。

編集:記録のために、コマンドに直接パスワードを提供できることを知っています。私はこれを直接テストしていました。

答え1

その後、「expect」コマンドを使用してさまざまな角度で問題を解決しました。ただし、次の方法は機能しません。

#!/usr/bin/expect
spawn sudo mount.cifs "//192.168.1.2/My Pictures" /home/pi/Desktop/Pictures -o user=Rob_
expect "Password: " {
    set send_slow {1 .1}
    send -s "a_password"
}

パスワードプロンプトにパスワードを入力すると応答しますが、ドライブがマウントされないため、どこに入力したのかわかりません。 「送信」を使用すると、古いゴミを処理でき、エラーメッセージなしで終了します。一方、シェルからコマンドを入力すると、間違ったパスワードに抗議するか、正常にインストールされます。

ここに答えがない場合は、別の質問にお送りします。

答え2

いくつかの理由があります:

  • mountが標準出力ではなく端末にプロンプ​​トを出力するため、デバッグprintfは機能しません。read prompt失敗してループに入りません。

  • パスワードをに送信しようとします/dev/stdin。これはうまくいきません。読み取りのみ可能です。

  • 標準入力はmount依然として端末に接続されています。端末でユーザー入力をシミュレートできません

  • stdinをパイプにしても、mountセキュリティ上の理由から、マウントはまだ端末を検出し、パイプではなく端末から読み込みます。

実際に必要なのはパスワードファイルです。読むman mount.cifs

資格情報=ファイル名

bashコマンド置換を使用して、偽のパスワードファイルを提供できます。

credentials=<( echo "password=$pwd" )

関連情報