Ich schreibe über ein riesiges Skript-Factory-Skript, das viele Wartungsskripte für meine Server generiert.
Bis jetzt schreibe ich einige Zeilen, die in einer Zeile mit echo -ne
z
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
Dies erzeugt mir (wenn sich zB 2 Server in meiner Konfigurationsdatei befinden) Code wie
if (( ($server1_E != 0 && $server1_E != 1) || ($server2_E != 0 && $server2_E != 1) ))
Alle anderen Codeblöcke, die dieses Inline-Schreiben von Code nicht benötigen, produziere ich mit Heredocs, da ich finde, dass sie viel besser zu schreiben und zu pflegen sind. ZB nach dem oberen Code habe ich den Rest wie generiert
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
Der letzte Codeblock sieht also so aus
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
Meine Frage
Gibt es eine Möglichkeit, wie sich ein Heredoc ähnlich verhält wie echo -ne
ohne das Zeilenende-Symbol?
sudo -u USERNAME
auf , dass statt findet Wie kann ich einen ‚sudo‘ Befehl in einem Skript ausführen? .
sudo
ohne Benutzernamen fragt nach dem Passwort, es sei denn, Sie haben es eingegeben, es gibt eine Verzögerung. Es ist noch schlimmer, wenn Sie das Skript nicht in einem Terminal ausführen, dann können Sie nicht einmal die Kennwortabfrage sehen und es wird einfach nicht funktionieren. Der sudo -u
Ansatz hat keines dieser Probleme.
sudo
in einem Skript etwas falsch machen müssen: Führen Sie stattdessen das gesamte Skript als root aus!