Observando um script bash que recebe informações do comentário de confirmação do Git para se atualizar. Simplificado:
script
:
#!/bin/bash
comment=''
printf '%s\n' "$comment"
upgrade_script() {
# Download latest:
curl -o updated_script https://path/to/file
# Get comment:
new_comment="$(curl https://path/to/comment)"
# Update comment='' with new_comment:
sed -i "3,0 s/comment=''/comment='$new_comment'/" updated_script
}
O problema é se o comentário tiver caracteres que quebram sed
ou mangles
batem. Por exemplo:
# that's all she wrote! => comment='that's all she wrote!
# use /need/ over /want/ => s/comment=''/'use /need/ over /want'/'
e, claro, com o potencial para coisas maliciosas, mas também não intencionais, como:
# Remove tmp files by: ' rm -r *;' => comment='Remove tmp files by: ' rm -r *;''
Isso seria suficiente para combater o problema?
Adicione isso antes do sed -i
comando:
new_comment=$(
sed \
-e "s/'/'\"'\"'/g" \
-e 's/[&\\/]/\\&/g; s/$/\\/; $s/\\$//'<<< "$new_comment"
)
Para bash
:
- Substitua
'
por'"'"'
.
Para sed
:
- Escape
&
, e\
terminadores/
de linha.
ou quais seriam as falhas?
Idealmente, isso não seria feito, mas curioso para saber.
Comentário lateral:
Outra solução, para mantê-lo em um arquivo , pode ser adicionar um exit
no script e adicionar o texto depois disso e, em seguida, usar sed
ou algo semelhante para imprimi-lo. Mas isso está além da minha pergunta.
#!/bin/bash
code
code
code
# When in need of the comment:
sed -n '/^exit # EOF Script$/$ {/start_xyz/,/end_xyz/ ...}'
# or what ever. Could even record offset and byte-length safely
code
code
exit # EOF Script
start_xyz
Blah blah blah
blaah
end_xyz
E pensando nisso eu acho que algo no reino de:
comment=<<<'SOF'
...
SOF
Onde basta substituir algum SOF
para não acabar prematuramente. Ainda assim, minha pergunta é a higienização acima. Obrigado.
Parece que você precisa combinar:
Então:
Embora zsh+perl seja uma escolha melhor do que bash+sed:
Tendo em mente que
comment
pode acabar contendo um caractere NUL que é bom para zsh e seus builtins ou funções, mas não pode ser passado como argumento para um comando externo.bash
's$(...)
remove os NULs.Para remover esse risco, você pode remover os NULs manualmente, canalizando a saída de
curl
paratr -d '\0'
ou comOu salvando se houver tal personagem: