Como excluir um arquivo chamado “filen / ame” (com barra) em um sistema de arquivos ext4 no debugfs?

26

Jogando com o e2fsprogs debugfs, por alteração / acidente, um arquivo chamado filen/amefoi criado. Obviamente, o caractere de barra /serve como caractere separador especial nos nomes de caminho.

Ainda usando debugfs, queria remover o arquivo nomeado filen/ame, mas tive pouco sucesso, pois o /caractere não é interpretado como parte do nome do arquivo?

O debugfs fornece uma maneira de remover este arquivo que contém a barra? Se sim, como?

Eu usei:

cd /tmp
echo "content" > contentfile
dd if=/dev/zero of=/tmp/ext4fs bs=1M count=50
mkfs.ext4 /tmp/ext4fs
debugfs -w -R "write /tmp/contentfile filen/ame" /tmp/ext4fs
debugfs -w -R "ls" /tmp/ext4fs

quais saídas:

debugfs 1.43.4 (31-Jan-2017)
 2  (12) .    2  (12) ..    11  (20) lost+found    12  (980) filen/ame

Eu tentei o seguinte para remover o filen/amearquivo:

debugfs -w -R "rm filen/ame" /tmp/ext4fs

mas isso não funcionou e apenas produziu:

debugfs 1.43.4 (31-Jan-2017)
rm: File not found by ext2_lookup while trying to resolve filename

Além de alterar o conteúdo do nó do diretório manualmente, existe uma maneira de remover o arquivo usando debugfs?

humanidade e paz
fonte
Escapar da barra de avanço ( filen\/ame) não funciona?
JAB
17
+1 e parabéns. Você conseguiu encontrar um dos dois únicos casos de "caractere estranho no nome do arquivo", onde apenas citar e / ou escapar corretamente o caractere em um comando shell não resolverá o problema. (O outro seria um byte nulo em um nome de arquivo, embora eu suspeito que, na maioria dos sistemas de arquivos, que seria apenas truncar o nome.)
Ilmari Karonen

Respostas:

33

Se você deseja uma correção e não está apenas testando debugfs, pode pedir ao fsck que faça o trabalho por você. Marque o sistema de arquivos como sujo e execute fsck -ypara alterar o nome do arquivo:

$ debugfs -w -R "dirty" /tmp/ext4fs
$ fsck -y /tmp/ext4fs
 ...
/tmp/ext4fs was not cleanly unmounted, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Entry 'filen/ame' in / (2) has illegal characters in its name.
Fix? yes
 ...
$ debugfs -w -R "ls" /tmp/ext4fs
2  (12) .    2  (12) ..    11  (20) lost+found    12  (980) filen.ame   
meuh
fonte
3
e2fsckpossui uma -fopção de orce que levará a uma verificação completa "mesmo que o sistema de arquivos pareça limpo".
David Foerster
3

Parabéns pelo funcionamento do fsck; se por algum motivo não funcionou, a resposta é ls -i1seguida por umounte então clri.

Ref: http://docstore.mik.ua/orelly/unix/upt/ch23_13.htm

Eu realmente testei esse método.

Joshua
fonte
Se este é o Linux (o que parece), vale a pena notar que clrinão é um comando separado (como em outros sistemas Unix), é um subcomando por dentro debugfs.
precisa
Hobbs @: deve fazer o meu incomum então. Oh espera, nvm clri foi apenas eco "clri $ 2" | debugfs "$ 1"
Joshua
Suas instruções requerem a execução do fsck de qualquer maneira - o que resolverá o problema, com a mensagem em Entry 'filen/ame' in / (2) has deleted/unused inode 12. Clear<y>?vez da anotada na outra resposta - mas executar o clri é uma etapa extra. Não parece haver uma maneira de resolver isso puramente de dentro dos debugfs.
Random832
@ Random832: O fsck não o consertava sozinho em épocas passadas. :(
Joshua
-1

Se você mover o arquivo para um diretório, poderá excluir o diretório com o arquivo nele.

mkdir foo 
mv filen* foo
rm -rf foo
carl
fonte
1
Isso funcionaria para qualquer outro nome de arquivo estranho, mas não funcionará para um nome de arquivo que contenha /.
Zwol