저는 개발 중인 일부 작은 소프트웨어를 설치하기 위해 bash 스크립트를 작성하고 있습니다. 해당 스크립트는 sudo
루트로 실행되지만 스크립트에 의해 실행되는 일부 명령은 변수에 이름을 유지하는 일반 사용자로 실행해야 합니다(또는 실행해야 합니다) $userName
. 대부분의 명령은 하나의 라이너이며 su -c "/what/ever/command" $userName
충분히 잘 작동합니다.
그러나 내가 실행하고 싶지 않은 명령 중 하나는 root
나에게 여러 가지를 묻는 것입니다(실제로는 단 한 가지이지만 여러 번: 기존 파일을 덮어써야 하는지 여부). 내가 " "라고 부를 수 있는 명령에는 baaad_command
기본 답변을 제공하는 옵션이 없습니다(" --assume-no
" 또는 이와 유사한 것이 없습니다).
내가 볼 때 실현 가능한 유일한 옵션은 다음을 사용하는 것입니다.예상하다n\r
명령을 실행하고 명령이 출력되고 문자열 마녀가 " "로 시작할 때마다 " "로 응답합니다 . 스크립트 에서 baaad_command가 요청한 횟수만큼 Overwrite
no(" "를 의미)로 응답하기를 원합니다.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 ..."'
아마도 추가 따옴표를 사용해야 할 것입니다 .