在管道(或子外壳?)之后查看 printf

在管道(或子外壳?)之后查看 printf

好吧,这很难提炼为一个问题,因为这实际上取决于我将如何解决它。

以下脚本旨在将 mount.cifs 命令通过管道传输到 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 后,调试打印输出也会被吞没?

如果有人至少可以告诉我如何在这种情况下打印调试信息,我将不胜感激,并且如果他们想告诉我如何彻底解决这个问题(最好是通过我正在拍摄的方法,但如果你有一个更优雅的,我有兴趣看到它)那么我也会很感激。

编辑:根据记录,我知道您可以直接向命令提供密码,我只是对自己进行测试。

答案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"
}

它通过输入密码来响应密码提示,但无法安装驱动器,因此我不确定输入的位置。我可以使用“发送”提供任何旧的垃圾,并且它会很高兴地关闭而不会出现错误消息,而如果我从 shell 输入命令,它要么抗议密码错误,要么成功安装。

如果这里没有人回答,我会将其作为单独的问题上传。

答案2

原因有多种:

  • 您的调试 printf 不起作用,因为 mount 将其提示打印到终端,而不是标准输出。read prompt失败并且从未进入循环。

  • 您正在尝试将密码回显到/dev/stdin。这是行不通的,你只能从中读取。

  • 的标准输入mount仍然连接到终端。无法模拟用户在终端中输入

  • 即使您将mountstdin 设为管道,出于安全原因, mount 仍会检测终端并从中读取,而不是管道

您真正需要的是一个密码文件。读man mount.cifs

凭证=文件名

您可以尝试使用 bash 命令替换来提供假密码文件:

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

相关内容