저는 개발 중인 일부 작은 소프트웨어를 설치하기 위해 bash 스크립트를 작성하고 있습니다. 스크립트는 root 로 실행되지만 sudo
스크립트에 의해 실행되는 명령 중 일부는 내가 변수에 이름을 유지하는 일반 사용자로 실행해야 합니다(또는 실행해야 합니다) $userName
. 대부분의 명령은 한 줄 명령이며 su -c "/what/ever/command" $userName
충분히 잘 작동합니다.
그러나 실행하고 싶지 않은 명령 중 하나가 root
나에게 무언가를 묻습니다(실제로는 단 한 가지이지만 여러 번: 기존 파일을 덮어써야 하는지 여부). " "라고 부를 수 있는 명령에는 baaad_command
기본 답변을 제공하는 옵션이 없습니다(" --assume-no
" 또는 이와 유사한 것은 없습니다).
유일하게 실행 가능한 옵션은 다음을 사용하는 것입니다.예상되는명령이 출력되고 문자열이 ""로 시작될 때마다 ""를 명령하고 응답합니다. 스크립트에서 baaad_command에서 요구하는 만큼 "no"(" "를 의미)로 응답 n\r
하도록 하고 싶습니다.Overwrite
n\r
"Overwrite... ? [y/n]"
나는 su,spawn,expect의 다양한 조합을 시도했지만 운이 없었습니다.
이것은 지금까지 나의 마지막 시도입니다.
#!/bin/bash
if [[ -d "$destinationFolder" ]] ; then
if [[ -n "$userName" ]] ; then
spawned=$(su -c expect -c "
spawn baaad_command --user \"foo\" --passwd \"bar\" \"$destinationFolder\"
expect {
Overwrite: { send \"n\r\"; exp_continue }
eof { exit }
}
" )
else
echo "Don't have a non-root username to install baaad_command with. Skipping"
exit 3
fi
else
echo "$destinationFolder directory not found in $(pwd). Can't continue"
exit 2
fi
다른 200번의 시도에 비하면 별것도 아닌데... 우연히 마지막 시도였을 뿐입니다.
어떤 조언이라도 대단히 감사하겠습니다. 미리 감사드립니다.
답변1
사용해야 할 수도 있습니다 su -c 'expect -c "spawn ..."'
. 추가 따옴표를 참고하세요.