好吧,这很难提炼为一个问题,因为这实际上取决于我将如何解决它。
以下脚本旨在将 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
仍然连接到终端。无法模拟用户在终端中输入即使您将
mount
stdin 设为管道,出于安全原因, mount 仍会检测终端并从中读取,而不是管道
您真正需要的是一个密码文件。读man mount.cifs
:
凭证=文件名
您可以尝试使用 bash 命令替换来提供假密码文件:
credentials=<( echo "password=$pwd" )