글쎄, 이것은 내가 어떻게 해결할 것인지에 달려 있기 때문에 질문으로 정제하기가 어렵습니다.
다음 스크립트는 세 가지 비밀번호에 대한 비밀번호를 묻는 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
보안상의 이유로 mount는 여전히 터미널을 감지하고 파이프가 아닌 터미널에서 읽습니다.
실제로 필요한 것은 비밀번호 파일입니다. 읽다 man mount.cifs
:
자격 증명=파일 이름
bash 명령 대체를 사용하여 가짜 비밀번호 파일을 제공할 수 있습니다.
credentials=<( echo "password=$pwd" )