Se você quiser excluir apenas um arquivo em /home/charlesingalls
(e não um arquivo em um subdiretório), é fácil: basta verificar se o argumento não contém /
.
case "$1" in
*/*) echo 1>&2 "Refusing to remove a file in another directory"; exit 2;;
*) rm -f /home/charlesingalls/"$1";;
esac
Isso executa rm
mesmo se o argumento for .
ou ..
ou vazio, mas, nesse caso, rm
será inutilmente incapaz de excluir um diretório.
Caracteres curinga não são relevantes aqui, já que nenhuma expansão de caractere curinga é executada.
Isso é seguro mesmo na presença de links simbólicos: se o arquivo é um link simbólico, o link simbólico (que está em /home/charlesingalls
) é removido e o destino desse link não é afetado.
Observe que isso pressupõe que /home/charlesingalls
não pode ser movido ou alterado. Isso deve ser ok se o diretório for codificado no script, mas se for determinado a partir de variáveis, a determinação poderá não ser mais válida no momento em que o comando rm
for executado.
Baseado no informações adicionais de que o argumento é um nome de host virtual, você deve fazer lista de permissões em vez de lista negra: verifique se o nome é um nome de host virtual sensato, em vez de apenas banir barras. Verifico se o nome começa com uma letra minúscula ou dígito e se não contém caracteres além de letras minúsculas, dígitos, pontos e traços.
LC_CTYPE=C LC_COLLATE=C
case "$1" in
*[!-.0-9a-z]*|[!0-9a-z]*) echo >&2 "Invalid host name"; exit 2;;
*) rm -f /home/charlesingalls/"$1";;
esac