파이프(또는 서브쉘?) 다음에 printf 보기

파이프(또는 서브쉘?) 다음에 printf 보기

글쎄, 이것은 내가 어떻게 해결할 것인지에 달려 있기 때문에 질문으로 정제하기가 어렵습니다.

다음 스크립트는 세 가지 비밀번호에 대한 비밀번호를 묻는 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" )

관련 정보