Misalkan saya menulis skrip bash dengan nama delay.sh
. Menurutmu apa yang dia lakukan?#!/bin/bash
sleep 30
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 30
ke 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 r
dalam #rm
sebagai 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
read(3, "#!/bin/bash\nsleep 30\n#echo \"Don'"..., 80) = 64
lseek(3, 0, SEEK_SET) = 0
dup2(3, 255) = 255
read(255, "#!/bin/bash\nsleep 30\n#echo \"Don'"..., 64) = 64
lseek(255, -43, SEEK_CUR) = 21
wait4(-1, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 2072
read(255, "echo \"Don't execute me\"\necho \"Ti"..., 64) = 42
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.