web-dev-qa-db-ja.com

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

わかりました。トラブルシューティングの方法に大きく依存するため、これを1つの質問にまとめるのは困難です。

次のスクリプトは、mount.cifsコマンドを3つのパスワードプロンプトのパスワードを入力するwhileループにパイプすることを目的としています。コメントアウトされたブロックは、プロンプトに応答していないという事実をデバッグしようとする試みです。

#!/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にリダイレクトした後でも、デバッグ出力が飲み込まれていますか?

誰かが少なくともこのシナリオでデバッグ情報を印刷する方法を教えてくれるなら、私は感謝します、そして彼らがこの問題を完全に解決する方法を教えてくれるなら(できれば私が狙っていた方法で、しかしあなたが持っているならもっとエレガントなものを見てみたいと思います)それなら私もそれをいただければ幸いです。

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

2
Rob F

それ以来、「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"
}

パスワードプロンプトに入力して応答しますが、ドライブのマウントに失敗するため、入力先がわかりません。古いガベージには「send」を指定でき、エラーメッセージなしで正常に閉じますが、シェルからコマンドを入力すると、パスワードが間違っているか、正常にマウントされることに抗議します。

ここに誰も答えない場合は、これを別の質問としてアップロードします。

1
Rob F