Tenha cuidado com a edição de scripts bash

Suponha que eu escrevi um script bash com o nome delay.sh. O que você acha que ele faz?

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

Parece que aguarda 30 segundos e exibe uma mensagem na tela. Não há truques aqui - ele faz exatamente isso. Há um comando perigoso no meio, mas é comentado e não é executado.

Imagine que eu execute esse script novamente, mas agora não quero esperar 30 segundos - isso é muito longo. Abro o segundo console, mudo sleep 30para sleep 3e salve o arquivo. O que você acha que vai acontecer agora?

Bem, depois de 30 segundos, o script excluirá todos os meus arquivos.

Isso ocorre porque o bash lê o conteúdo do script em fragmentos à medida que avança, rastreando o deslocamento em bytes. Quando eu remover um caractere da string sleep, o deslocamento para o início do próximo pontos de comando para r, em #rmvez disso #. Do ponto de vista do intérprete, ele #é deslocado para a linha anterior e, portanto, executa o comando a partir de rm.

Isso pode ser confirmado observando as chamadas do sistema bash no Linux. Aqui está a questão strace bash delay.sh, com comentários e abreviação.

#  
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

Portanto, tenha cuidado ao começar a editar o script bash atualmente em execução. Ele pode executar o comando errado ou fazer algo muito inesperado.

All Articles