Hati-hati dengan mengedit skrip bash

Misalkan saya menulis skrip bash dengan nama delay.sh. Menurutmu apa yang dia lakukan?

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

Sepertinya menunggu 30 detik dan kemudian menampilkan pesan di layar. Tidak ada trik di sini - dia melakukan itu. Ada perintah berbahaya di tengah, tetapi itu dikomentari dan tidak dieksekusi.

Bayangkan saya menjalankan skrip ini lagi, tetapi sekarang saya tidak ingin menunggu 30 detik - ini terlalu lama. Aku membuka konsol kedua, perubahan sleep 30ke sleep 3, kemudian menyimpan file tersebut. Menurut Anda apa yang akan terjadi sekarang?

Nah, setelah 30 detik script akan menghapus semua file saya.

Ini karena bash membaca isi skrip dalam fragmen saat progres, melacak offset dalam byte. Ketika saya menghapus satu karakter dari string sleep, offset untuk memulai perintah selanjutnya menunjuk ke rdalam #rmsebagai gantinya #. Dari sudut pandang penerjemah, itu #bergeser ke baris sebelumnya, sehingga mengeksekusi perintah mulai dari rm.

Ini dapat dikonfirmasi dengan mengamati panggilan sistem bash di Linux. Inilah masalahnya strace bash delay.sh, dengan komentar dan singkatan.

#  
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

Karena itu, berhati-hatilah saat Anda mulai mengedit skrip bash yang sedang berjalan. Dia mungkin melakukan perintah yang salah atau melakukan sesuatu yang sangat tidak terduga.

All Articles