Bem-vindo ao Bash Challenge # 6 por Yes I Know IT e It's FOSS. Neste desafio semanal, mostraremos uma captura de tela do terminal e pediremos que explique por que o resultado não é o que esperávamos.
Obviamente, a parte mais divertida e criativa do desafio será descobrir como corrigir o (s) comando (s) exibido (s) na tela para obter o resultado correto. Desafio Bash da semana passada foi o nível um, mas desta vez aumentamos a aposta e temos um problema de nível 2 para você.
Você também pode comprar esses desafios (com desafios não publicados) na forma de livro e nos apoiar:
Pronto para jogar? Então, aqui está o desafio desta semana:
O arquivo que sobreviveu ao rm
Hoje, nossa descrição é bem curta: tenho três arquivos em um diretório. Como root, usei rm *
nesse diretório. Mas há um arquivo que obstinadamente se recusa a ser excluído:
root:011# ls -ls total 12 4 -rw-r--r-- 1 root root 29 nov 21 21:25 a 4 -rw-r--r-- 1 root root 29 nov 21 21:25 b 4 -rw-r--r-- 1 root root 29 nov 21 21:23 c root:012# rm * rm: cannot remove 'c': Operation not permitted root:013# ls -ls total 4 4 -rw-r--r-- 1 root root 29 nov 21 21:23 c
Seu desafio é encontrar:
- O que evitou que o terceiro arquivo fosse excluído?
- Como realmente deletar esse arquivo?
Estamos ansiosos para ler suas soluções na seção de comentários abaixo!
Alguns detalhes
Para criar este desafio, usei:
- GNU Bash, versão 4.4.5 (x86_64-pc-linux-gnu)
- Debian 4.8.7-1 (amd64)
- Todos os comandos são fornecidos com uma distribuição Debian padrão
- Nenhum comando recebeu alias
A solução
Como reproduzir
Aqui está o código bruto que usamos para produzir este desafio. Se você executá-lo em um terminal, poderá reproduzir exatamente o mesmo resultado exibido na ilustração do desafio (assumindo que você esteja usando a mesma versão de software que eu):
# as root : cd /tmp rm -rf ItsFOSS mkdir -p ItsFOSS cd ItsFOSS date > a date > b date > c sudo chattr +i c clear ls -ls rm * ls -ls
Qual era o problema?
Usei o comando chattr
para definir o atributo de sistema de arquivos Linux (i) mmutable para o arquivo c
. Dependendo do seu sistema de arquivos exato, todas as alterações de atributo não estão disponíveis.
Mas aqui, estou usando um sistema de arquivos ext2 que suporta a sinalização i
. E para citar o homem:
A file with the 'i' attribute cannot be modified: it cannot be deleted or renamed, no link can be created to this file and no data can be written to the file. Only the superuser or a process possessing the CAP_LINUX_IMMUTABLE capability can set or clear this attribute.
Basicamente, após o chattr +i
, o arquivo é bloqueado até limparmos este sinalizador. Observe que o atributo está armazenado no sistema de arquivos. Ele sobreviverá a reinicializações e ciclos de desmontagem/montagem do sistema de arquivos.
Como consertar isso?
Primeiro, podemos verificar a explicação acima usando o comando lsattr
:
root:014# lsattr c ----i-------------- c
Claramente, o sinalizador (i) mmutable está definido. Portanto, para remover esse arquivo (ou fazer qualquer alteração nele), tenho que limpar o sinalizador primeiro. Depois disso, posso fazer o que quiser no arquivo, como de costume:
root:015# chattr -i c root:016# lsattr c ------------------- c root:017# rm c root:018# ls -ls total 0
Se você não está ciente da existência de chattr
, seus efeitos podem ser bastante intrigantes. Vale a pena mencionar chattr
é um comando específico do Linux, originalmente escrito para os sistemas de arquivos ext2/3/4. Mas alguns de seus recursos de hoje são suportados por outros sistemas de arquivos.
No mundo BSD, existe um comando semelhante chamado chflags
. Leia mais na Wikipedia (https://en.wikipedia.org/wiki/Chattr) para uma introdução suave a esses comandos em comparação com chattr
.
Esperamos que você tenha gostado desse desafio. Fique ligado para mais diversão!
Via itsfoss.com. Você pode conferir o post original em inglês:
[Bash Challenge 6] Test Your Bash Scripting Knowledge With This PuzzleÚltima atualização deste artigo: 23 de july de 2017