Seien Sie vorsichtig beim Bearbeiten von Bash-Skripten

Angenommen, ich habe ein Bash-Skript mit dem Namen geschrieben delay.sh. Was glaubst du, macht er?

#!/bin/bash
sleep 30
#rm -rf --no-preserve-root /
echo "Time's up!"

Es sieht so aus, als würde es 30 Sekunden warten und dann eine Meldung auf dem Bildschirm anzeigen. Hier gibt es keine Tricks - genau das macht er. In der Mitte befindet sich ein gefährlicher Befehl, der jedoch auskommentiert und nicht ausgeführt wird.

Stellen Sie sich vor, ich führe dieses Skript erneut aus, aber jetzt möchte ich nicht 30 Sekunden warten - das ist zu lang. Ich öffne die zweite Konsole, wechsle sleep 30zu sleep 3und speichere die Datei. Was denkst du wird jetzt passieren?

Nun, nach 30 Sekunden löscht das Skript alle meine Dateien.

Dies liegt daran, dass bash den Inhalt des Skripts im Verlauf in Fragmenten liest und den Versatz in Bytes verfolgt. Wenn ich ein Zeichen aus der Zeichenfolge entferne sleep, zeigt der Versatz für den Start des nächsten Befehls stattdessen auf rin . Aus Sicht des Interpreters wird es in die vorherige Zeile verschoben, sodass der Befehl ab ausgeführt wird . Dies kann durch Beobachtung der Bash-Systemaufrufe unter Linux bestätigt werden. Hier ist das Problem mit Kommentaren und Abkürzungen.#rm##rm

strace bash delay.sh

#  
openat(AT_FDCWD, "delay.sh", O_RDONLY)  = 3

#    ( 80 )
read(3, "#!/bin/bash\nsleep 30\n#echo \"Don'"..., 80) = 64

#   
lseek(3, 0, SEEK_SET)                   = 0

#      255
dup2(3, 255)                            = 255

#  64-  ,   
read(255, "#!/bin/bash\nsleep 30\n#echo \"Don'"..., 64) = 64

#      ,    
# Offset 21 is the `#`
lseek(255, -43, SEEK_CUR)               = 21

#  ,   sleep
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 2072

#   wait4    `30`  `3`

#  64-  ,    
#         echo
read(255, "echo \"Don't execute me\"\necho \"Ti"..., 64) = 42

# Bash    echo    
# , -   
write(1, "Don't execute me\n", 17)      = 17
write(1, "Time's up!\n", 11)            = 11

#       
read(255, "", 64)                       = 0

Seien Sie daher vorsichtig, wenn Sie mit der Bearbeitung des aktuell ausgeführten Bash-Skripts beginnen. Er kann den falschen Befehl ausführen oder etwas sehr Unerwartetes tun.

All Articles