서버에 대한 많은 유지 보수 스크립트를 생성하는 거대한 스크립트 팩토리 스크립트를 작성 중입니다.
지금까지 내가 한 줄에 작성해야 몇 줄 쓰기 echo -ne예를
echo -n "if (( " | sudo tee -a /usr/local/bin/upgradeAllServers &> /dev/null
# Generate exitCode check for each Server
IFS=" "
COUNT=0
while read -r name ipAddr
do
if(($COUNT != 0))
then
echo -n " || " | sudo tee -a /usr/local/bin/upgradeAllServers &> /dev/null
fi
echo -n "(\$"$name"_E != 0 && \$"$name"_E != 1)" | sudo tee -a /usr/local/bin/upgradeAllServers &> /dev/null
COUNT=$((COUNT+1))
JOBSDONE=$((JOBSDONE+1))
updateProgress $JOBCOUNT $JOBSDONE
done <<< "$(sudo cat /root/.virtualMachines)"
echo " ))" | sudo tee -a /usr/local/bin/upgradeAllServers &> /dev/null
이것은 (구성 파일에 2 개의 서버가있는 경우) 코드를 생성합니다.
if (( ($server1_E != 0 && $server1_E != 1) || ($server2_E != 0 && $server2_E != 1) ))
내가 작성하고 유지 관리하는 것이 더 낫다는 것을 알기 때문에 heredocs로 생성하는 코드의 인라인 작성이 필요하지 않은 다른 모든 코드 블록. 예를 들어 위 코드 후에 나머지는 다음과 같이 생성됩니다.
cat << EOF | sudo tee -a /usr/local/bin/upgradeAllServers &> /dev/null
then
# Print out ExitCode legend
echo " ExitCode 42 - upgrade failed"
echo " ExitCode 43 - Upgrade failed"
echo " ExitCode 44 - Dist-Upgrade failed"
echo " ExitCode 45 - Autoremove failed"
echo ""
echo ""
fi
EOF
최종 코드 블록은
if (( ($server1_E != 0 && $server1_E != 1) || ($server2_E != 0 && $server2_E != 1) ))
then
# Print out ExitCode legend
echo " ExitCode 42 - upgrade failed"
echo " ExitCode 43 - Upgrade failed"
echo " ExitCode 44 - Dist-Upgrade failed"
echo " ExitCode 45 - Autoremove failed"
echo ""
echo ""
fi
내 질문
Heredoc echo -ne이 줄 끝 이 없는 것과 비슷한 방식으로 작동하는 방법이 있습니까?
sudo -u USERNAME에 그 대신에, 참조 I 스크립트 내부의 'sudo는'명령을 실행하려면 어떻게합니까? .
sudo사용자 이름 이 없는 스크립트 는 암호를 입력하지 않으면 암호를 묻습니다. 터미널에서 스크립트를 실행하지 않으면 암호 쿼리를 볼 수 없으며 작동하지 않습니다. sudo -u접근 방식은 이러한 문제가 없습니다.
sudo스크립트에 필요한 경우 잘못하고 있습니다 : 대신 전체 스크립트를 루트로 실행하십시오!