[Desafio Bash 6] Teste seu conhecimento de script Bash com este quebra-cabeça

23 de julho de 2017

! [Exercício de programação do Bash Challenge](bash-challenge-6.webp) Exercício de programação do Bash Challenge

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

! [Desafio Bash Script](bash-challenge-6-description.webp) Desafio Bash Script

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:

Comandos para usar no terminal

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):

Comandos para usar no terminal

# 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:

Comandos para usar no terminal

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:

Comandos para usar no terminal

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:

Comandos para usar no terminal

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!

Confira também a versão original desse post em inglês
Esse post foi originalmente escrito por Abhishek Prakash e publicado no site itsfoss.com. Tradução sujeita a revisão.

[Bash Challenge 6] Test Your Bash Scripting Knowledge With This Puzzle

Propaganda
Blog Comments powered by Disqus.
Propaganda