Unbekannter Code im Skript

7

Ich habe Code in einem Skript gefunden, das mir von einer anderen Person als Ressource zum Sperren / Härten von Ubuntu 16.04 für ein Projekt gegeben wurde, das ich gerade mache.

Ich habe keine Ahnung, was es tut, und möchte es nicht ausführen, wenn ich die Änderung, die es vornehmen würde, nicht identifizieren kann. Ist jemandem bewusst, was es tut oder ändert? Nur Code ohne einen kurzen Erklärungskommentar, und es ist das einzige, was ich nicht weiß. Auch die zweite Funktion ist durch die Funktion identifizierbar, aber ich verstehe den Zweck oder die Einzelheiten nicht.

function bacon.config.ubuntu.chage() {
CHAGE_SCRIPT='/etc/cron.daily/userchage'
if [ ! -e $CHAGE_SCRIPT ]; then
printf "#%c/bin/bash \nfor i in \$(awk -F: '{if(($3 >= 1000)&&($3 <65534)) print \$1}' /etc/passwd); do \nchage -m 0 -M 60 -W 10 \$i \ndone \n" ! > $CHAGE_SCRIPT
    chmod +x $CHAGE_SCRIPT
fi
}

function bacon.config.ubuntu.log.rotate() {
  echo "bacon.config.ubuntu.log.rotate: [INFO] Installing logrotate..."

  sudo apt-get install logrotate 1>/dev/null

  echo "bacon.config.ubuntu.log.rotate: [INFO] Configuring logrotate..."
  sed 's/rotate 4/rotate 60/' /etc/logrotate.conf > /etc/logrotate.conf.new
  mv /etc/logrotate.conf.new /etc/logrotate.conf
  sed 's/rotate 1/rotate 60/' /etc/logrotate.conf > /etc/logrotate.conf.new
  mv /etc/logrotate.conf.new /etc/log.rotate.conf
  sed 's/rotate 7/rotate 1825/' /etc/logrotate.d/rsyslog > /etc/logrotate.d/rsyslog.new
  mv /etc/logrotate.d/rsyslog.new /etc/logrotate.d/rsyslog
}

Jede Hilfe bei der Identifizierung dieser wäre erstaunlich.

Brendan77222
quelle
4
Ich würde die Person, die mir den Code gegeben hat, fragen, was er tut.
WinEunuuchs2Unix
1
@ WinEunuuchs2Unix Normalerweise würde ich das auch, aber sie sind aufgrund persönlicher Umstände für eine Weile nicht im Büro. Vertrauen Sie mir, ich weiß, wie viel einfacher das wäre. :)
Brendan77222
4
Gut gemacht, wenn Sie ein Skript nicht als Root ausführen, wenn Sie nicht wissen, was es tut.
Wildcard
Sie können jederzeit eine VM starten und testen! Ich war schon immer ein Versuch, zu scheitern und ein
bisschen zu

Antworten:

6

Die erste Funktion prüft, ob eine Datei $CHAGE_SCRIPTvorhanden ist, und versucht andernfalls, sie mit einer printfAnweisung zu erstellen . Sie können sehen, was diese Anweisung bewirkt, indem Sie sie in einem Terminal ausführen:

$ printf "#%c/bin/bash \nfor i in \$(awk -F: '{if(($3 >= 1000)&&($3 <65534)) print \$1}' /etc/passwd); do \nchage -m 0 -M 60 -W 10 \$i \ndone \n" !
#!/bin/bash 
for i in $(awk -F: '{if(( >= 1000)&&( <65534)) print $1}' /etc/passwd); do 
chage -m 0 -M 60 -W 10 $i 
done 

Sie werden feststellen, dass Instanzen der $3Auswertung leer sind, da sie (anders als \$1) nicht vor einer Erweiterung durch die Shell geschützt sind. Die Verwendung von %czum Einfügen des !In #!/bin/bashlegt nahe, dass der ursprüngliche Autor nicht wirklich versteht, wie die Erweiterung des Bash-Verlaufs funktioniert.

IMHO wäre es einfacher und klarer, ein Here-Dokument zu verwenden:

function bacon.config.ubuntu.chage() {
CHAGE_SCRIPT='/etc/cron.daily/userchage'
if [ ! -e "$CHAGE_SCRIPT" ]; then
    cat << 'EOF' > "$CHAGE_SCRIPT"
#!/bin/bash 
for i in $(awk -F: '{if(($3 >= 1000)&&($3 <65534)) print $1}' /etc/passwd); do 
chage -m 0 -M 60 -W 10 $i 
done
EOF
    chmod +x "$CHAGE_SCRIPT"
fi
}

Die Bedienung der zweiten Funktion sollte ziemlich offensichtlich sein - sie könnte vereinfacht werden, indem alle sedBefehle so kombiniert werden, dass die Datei nur einmal geschrieben / verschoben wird.

Steeldriver
quelle
Wenn die $ 3 leer ausgewertet werden, gibt es einen Grund, sie aufzunehmen? Wenn ich wollte, dass etwas dieselbe Aufgabe erledigt, ohne nutzlose Teile, wie viel müsste ich ändern?
Brendan77222
1
@ Brendan77222 Ich gehe davon aus, dass die leere Auswertung von $3unbeabsichtigt war - da dies zu einem Syntaxfehler von awk führen würde
steeldriver
Wäre es etwas, mit dem ich mich befassen muss, wenn ich es rein lasse oder herausnehme? Soll ich wollen, dass es zumindest wie beabsichtigt funktioniert?
Brendan77222
4

Das Skript enthält zwei Funktionsdefinitionen. Die erste Funktion bacon.config.ubuntu.chageerstellt ein Skript unter /etc/cron.daily/userchage(von mir hinzugefügte Kommentare):

#!/bin/bash
# loop through users with uid >= 1000 and uid < 65534 theoretically, but $3 isn't escaped -> doesn't work
for i in $(awk -F: '{if(( >= 1000)&&( <65534)) print $1}' /etc/passwd);do
    # set password to expire after 60 days, warning after 50 days
    chage -m 0 -M 60 -W 10 $i
done

Die zweite Funktion installiert logrotate und erstellt eine Konfigurationsdatei dafür.

FliegendeWurst
quelle
Genial, diese Kommentare helfen sehr. Gibt es einen Grund, ein Skript unter /etc/chron.daily/userchage einzufügen, anstatt nur die hier eingegebene for-Schleife auszuführen? Ich bin mit der Funktion der Userchage-Datei nicht vertraut
Brendan77222
1
Ja, alle Skripte in /etc/cron.daily/ werden einmal pro Tag ausgeführt.
FliegendeWurst
Super, danke für die Bestätigung, was ich vermutet habe. Tolle Hilfe.
Brendan77222
2

Das chageProgramm ändert den Kennwortablauf für alle Benutzer. Das heißt, sie können ihr aktuelles Passwort höchstens 60 Tage lang behalten . Es wird täglich ausgeführt. Die Mindestdauer von 0ist ab /security/78758/what-is-the-purpose-of-the-password-minimum-age-setting fraglich . Fragen Sie unter https://security.stackexchange.com, ob dies wirklich empfohlen wird.

Warum logrotatedie Sicherheit verbessert werden sollte, liegt etwas über mir.

serv-inc
quelle
1
Oh, wir wollen definitiv ein Mindestalter für das Passwort von 24 Stunden. Ich nehme an, das ist die -m Flagge? Ich kann auch die Manpage lesen, war nur verwirrt darüber, warum eine Prüfung für ein Skript verwendet wurde. Aber ich habe jetzt das Gefühl, dass Ihr Kommentar dies tut, um sicherzustellen, dass dies täglich und nicht nur einmal überprüft wird.
Brendan77222
1
Genau. Und -mscheint richtig. Wenn Sie die Manpages lesen können, können Sie man cronnach dem cron.dailyOrdner suchen.
serv-inc