é possível procurar por arquivos que possuem um atributo de arquivo especial do Linux?

1

é possível procurar um arquivo no sistema operacional Linux que tenha um atributo de arquivo específico como este: ---S--l---

---S--l---  1  root    root          0 Mar  1004:25/opt/csTuner/iba/wys/tuer_lolk

O que é S nas permissões:

S - as alterações são gravadas de forma síncrona no disco; isso é equivalente à opção de montagem 'sync' aplicada a um subconjunto dos arquivos.

Meu objetivo é pesquisar arquivos escritos de forma síncrona no disco.

    
por maihabunash 11.06.2015 / 15:09

2 respostas

2

O exemplo na sua pergunta parece com a saída ls -l , não com a saída lsattr . Na saída ls -l , o primeiro campo é o modo , que é o tipo (regular, diretório, link simbólico ...) e permissões.

O S bit nessa posição significa setuid , mas sem permissão de execução para o usuário. Aqui, dado que nenhum usuário / grupo / outro tem permissões de execução, isso faz pouco sentido. O l significa que o bit setgid está definido mas não é executado. Para um arquivo normal, isso significa um arquivo com bloqueio obrigatório ativado.

Mais provável aqui, o arquivo foi criado com permissões erradas, como chmod 6000 em vez de chmod 600 .

Agora, o bit "sync" S ao qual você está se referindo é para a saída de lsattr .

Se você usar chattr +S file no Linux, a saída lsattr file será semelhante a:

--S----------e-- file

Para encontrar os arquivos com esse sinalizador:

Se os nomes dos arquivos não contiverem caracteres de nova linha, você poderá fazer:

find . ! -type l -exec lsattr -d {} + | sed -n 's/^[^ ]*S[^ ]* //p'

Observe que a posição de S na linha ou o comprimento da parte ------- não têm garantia de ser a mesma de uma versão de e2fsprogs para a próxima.

Se você não pode garantir que os nomes de arquivo não contenham caracteres de nova linha, você poderá fazê-lo:

(find .//. ! -type l -exec lsattr -d {} +; echo //) |
  sed -ne '/\/\//!{H;d;}' -e 'x; s|^[^ ]*S[^ ]* .//.|./|p'

(o início de cada nome de arquivo será identificado por .// ).

    
por 11.06.2015 / 16:43
2
find -perm

É o que você quer - ele permitirá que você especifique um modo octal para 'encontrar' para ... bem, encontrar.

Você pode encontrar qual perm procurar com 'stat' que lhe dará o que é atualmente.

Então, por exemplo

find . -perm 4750

Eu não reconheço o seu sinalizador de bits bem o suficiente para dizer-lhe o modo octal deles, então você terá que procurar por si mesmo.

Editar: conforme apontado, essas não são permissões de arquivos "normais", mas chattr de atributos. Então você tem que fazer algo um pouco diferente. Eu abordaria isso assim:

#!/usr/bin/perl

use strict;
use warnings;


open ( my $attrs, "|-", "lsattr -R /path" );

while ( <$attrs> ) {
   my ( $attrs, $filename ) = split; 
   if ( $attrs =~ m/S/ ) { 
        print $filename;
   }
}

close ( $attrs );

Embora você provavelmente pudesse:

lsattr -R | grep '^[-A-Za-z]*S[-A-Za-z]* '
    
por 11.06.2015 / 16:36