Ocultar arquivos no Linux sem usar o ponto

32

Desejo ocultar arquivos no Linux sem usar o ponto, pois é possível no Windows.

Existe uma maneira de fazer isso?

aWebDeveloper
fonte
6
Manter em arquivos mente esconderijos (ofuscação) não é substituto para a segurança (restringindo o acesso)
uSlackr

Respostas:

26

Você não pode. Há uma diferença fundamental na maneira como os sistemas de arquivos lidam com as configurações ocultas. No Windows, o sistema de arquivos armazena vários atributos para o arquivo em metadados, incluindo os atributos "oculto" e "sistema" (ambos tipos de arquivos ocultos). Nos sistemas de arquivos * nix comuns, nenhum atributo é armazenado. Em vez disso, as informações devem ser colocadas em outro lugar, como no nome do arquivo. A convenção é assim que os arquivos começam com. (e dependendo do seu sistema, talvez outros como _) não sejam mostrados pela maioria das ferramentas por padrão.

Isto é puramente por conveniência, a. iniciar um nome de arquivo significa absolutamente nada, mas "o usuário provavelmente não deseja ver isso o tempo todo". Para se certificar de que você sabe, a execução de eg ls -amostrará todos os arquivos.

Se você não deseja que um arquivo perturbe suas listagens no Linux, renomeie-o para começar com um ponto (bônus: isso também funcionará no OS X, se estivermos falando de um dispositivo portátil). Se você não deseja que os usuários encontrem um arquivo, está fazendo errado - é para isso que servem as permissões.

As permissões Unix, pois pertencem aos diretórios, freqüentemente confundem as pessoas, e talvez entendê-las melhor o ajude. As permissões "ler" e "executar" ( re x) significam algo diferente para diretórios do que para arquivos. Para diretórios, a xpermissão de execução determina se você acessa ou não os inodes no diretório. A rpermissão de leitura determina se você pode ou não acessar a listagem do diretório. Funcionalmente, xpermite que o usuário faça coisas em um diretório, enquanto a rpermissão permite que ele veja o que está nele. São diferentes e a diferença pode ser confusa. Vejamos um exemplo:


jeanluc@login64: ~ $ mkdir example
jeanluc@login64: ~ $ echo "you can read it" > example/file
jeanluc@login64: ~ $ ls example/
file
jeanluc@login64: ~ $ cat example/file
you can read it

jeanluc@login64: ~ $ chmod -x example/
jeanluc@login64: ~ $ ls example/
ls: cannot access example/file: Permission denied
file
jeanluc@login64: ~ $ cat example/file
cat: example/file: Permission denied
jeanluc@login64: ~ $ cd example/
-bash: cd: example/: Permission denied

jeanluc@login64: ~ $ chmod +x example/
jeanluc@login64: ~ $ chmod -r example/
jeanluc@login64: ~ $ ls example/
ls: cannot open directory example/: Permission denied
jeanluc@login64: ~ $ cat example/file
you can read it
jeanluc@login64: ~ $ cd example/
jeanluc@login64: ~/example $ ls
ls: cannot open directory .: Permission denied
jeanluc@login64: ~/example $ cd ..

Portanto, observe que, sem executar, ainda posso listar os arquivos (embora ls mostre um erro porque não é possível obter as propriedades do arquivo), mas não consigo mudar para o diretório ou ler os arquivos nele. Sem a leitura, não consigo listar os arquivos, mas ainda posso mudar para o diretório e, se souber o nome de um arquivo, ainda posso acessá-lo.

Observe, no entanto, que a remoção da permissão de leitura apenas oferece segurança pela obscuridade. Se o usuário adivinhar o nome do arquivo, ele poderá ler seu conteúdo.

Isso pode não ter sido realmente relevante para sua pergunta. Eu só queria ter certeza de que você entendeu as permissões de diretório.

jcrawfordor
fonte
26

Crie um arquivo .hiddenno diretório com os nomes dos arquivos a serem ocultos (um nome em cada linha).

Em seguida, adicione o seguinte ao seu ~/.bashrc:

ls () {
  if [ -f .hidden ]; then
    declare GLOBIGNORE="$GLOBIGNORE:.*:$(tr '\n' ':' < .hidden)"
    ls "$@"
  fi
}

Agora seu lscomando não lista esses arquivos.

Eu uso essa técnica para ocultar meus arquivos __pycache__e __init__.py.


EDIT: como em outro comentário, isso também os oculta em pelo menos um (Nautilus), mas provavelmente em vários navegadores de arquivos da GUI também.

A Sz
fonte
é interessante. Também funciona no nautilus ou em outras ferramentas da GUI? Você consegue ver os arquivos ls -al?
Jakuje
1
código está faltando um "" no final (e no caso de você querer saber onde os upvotes são de:. askubuntu.com/a/713591/15811 ) ;-)
Rinzwind
14

Você pode realmente ocultar arquivos no Linux sem adicionar um ponto. Isso realmente os esconde no Nautilus; um lsda linha de comando ainda listará os arquivos.

  1. Crie um arquivo de texto nomeado .hiddenna pasta em que deseja ocultar os arquivos.
  2. Adicione os nomes dos arquivos ou pastas que você deseja ocultar, um por linha, ao arquivo.
  3. Atualize seu navegador de arquivos.
Façam
fonte
2
não funciona aqui com "ls" no debian 5.0. É específico para nautilus, golfinho ou ...?
Tim Haegele
2
Os arquivos estão ocultos no Nautilus; não está em lslistas.
Faça
1
solução simplesmente impressionante! :)
Merianos Nikos
4

Um ponto é usado para ocultar arquivos no linux, e isso não pode ser alterado.

No entanto, você pode jogar com as permissões de arquivo para impedir que os usuários possam ter acesso a determinada pasta / arquivo. Tente experimentar com o chmodcomando.

bbaja42
fonte
2

Você está apenas tentando ocultar arquivos do gerenciador de arquivos e / ou do ambiente de trabalho da interface gráfica do usuário? Nesse caso, pode haver opções além de simplesmente prefixar o nome do arquivo com um ponto.

Eu acredito que os arquivos somente adicionais escondidos por qualquer gerenciador de arquivos Linux são arquivos de backup, ou seja, aqueles que terminam em um til ~ou .bakou o que eles acreditam que é a extensão do backup. De qualquer forma, você provavelmente está com sorte se tudo o que você deseja fazer é ocultar os arquivos de backup do gerenciador de arquivos.

Não dê aos seus arquivos uma extensão de backup para ocultá-los ou eles poderão ser excluídos acidentalmente !!

Além disso, você pode ocultar arquivos do Finder no Mac OS X usando o comando SetFile -a V [file]ou a edição, /.hiddenmas obviamente isso não oculta o arquivo do lsprograma da linha de comando .

Jeff Burdges
fonte
3
No OS X, você também pode ocultar arquivos por chflags hidden filename.
slhck
2

Se você possui algumas habilidades de programação e se apenas o que precisa é ocultar nomes de arquivos para que o usuário possa parar de bagunçar o espaço visual, é possível invadi-lo!

Considerarei apenas as ferramentas de linha de comando, pois elas são bastante uniformes e são as únicas ferramentas constantemente usadas sou eu.

Existem várias maneiras de armazenar essas informações:

  1. Você pode armazenar o atributo estendido "oculto" nos arquivos selecionados. Vejoman attr

      attr -s hidden -V true your_file
    
  2. Ou, como mencionado acima, você pode armazenar a lista de nomes de arquivos no .hiddenarquivo

Importante: Isso não funcionará imediatamente, você precisará implementar a lógica; os sistemas limpos apenas ignoram os .hiddenarquivos e os hiddenatributos estendidos!

Também existem várias implementações possíveis:

  1. Se você tiver apenas alguns arquivos, escreva no seu .bashrcarquivo

    alias ls='ls -I filename_1 -I filename_2'
    

    man ls Para maiores informações.

  2. Escreva um documento function lscomo ele lide com toda a lógica por trás do reconhecimento de arquivos ocultos e lista de montagem de todas as -Ientradas e, em seguida, execute /bin/lscom os sinalizadores de ignorar apropriados. Tarefa muito trabalhosa, porque você precisa lidar com todos os lsparâmetros corretamente.

  3. Obter fontes de coreutils

    git clone git://git.sv.gnu.org/coreutils
    

    ou

    git clone git://git.suckless.org/sbase
    

    Faça o patch da maneira que você precisa para lidar com a implementação de arquivos ocultos. E coloque-o no seuPATH

    Eu o cortei em menos de 5 minutos usando fontes sem sugador e o diff é assim:

     diff --git a/ls.c b/ls.c
     index cdfce4d..8197409 100644
     --- a/ls.c
     +++ b/ls.c
     @@ -214,6 +214,17 @@ lsdir(const char *path)
             first = 0;
             while ((d = readdir(dp))) {
     +///////////////////////////////////////////////
     +// Dirty hack to implement hidden files
     +// FIXME: Make proper(!) subroutine
     +               char attr_command[1024] = "attr -Lqg hidden "; // Oh, dear. That's bad
     +               int attr_code;
     +               strcat(attr_command, d->d_name);
     +               strcat(attr_command, " >/dev/null 2>&1");
     +               attr_code = system(attr_command);
     +               if (!attr_code)
     +                       continue;
     +///////////////////////////////////////////////
                     if (d->d_name[0] == '.' && !aflag && !Aflag)
                             continue;
                     else if (Aflag)
    
Aleksy Grabowski
fonte
ls.cmentiras em src, não o diretório raiz, e não há nenhuma função lsdirno ls.c.
Melab
2

Esta é a melhor solução que encontrei, adicione ao seu perfil :

alias ls="/bin/ls --color=auto --ignore='*.egg-info' --ignore='__pycache__'"

Se você precisar de mais padrões, basta adicionar mais --ignoresinalizadores.

jsmedmar
fonte
Isso levará a uma cadeia muito, muito longa, se mais do que alguns arquivos precisarem ser ocultados. Para vários arquivos, existem maneiras mais eficientes de fazer isso, mas, para alguns arquivos, é uma boa solução.
JW0914 22/11
2

Atualmente você pode escrever o FUSE que oculta arquivos de acordo com a configuração especificada.

Este artigo me faz acreditar que você precisa ajustar a getdirfunção:

getdir: int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
Isso lê o conteúdo de um diretório. Esta operação é a opendir(), readdir()..., closedir()seqüência em uma chamada. Para cada entrada de diretório, a filldir()função deve ser chamada.

Não sou programador, mas imagino que se possa getdiromitir todos os arquivos listados no .hiddenarquivo (por exemplo) . Se você implementar isso corretamente, todas as ferramentas (GUI ou não) serão afetadas.

Kamil Maciorowski
fonte
1

Você pode 'esconder' o conteúdo de um diretório por tirar perms 'x' para o grupo, ou outro: chmod go-x directoryname. Você não podia mais listar arquivos, embora pudesse acessar um arquivo se soubesse o caminho exato. Isso não soa como o que você deseja.

Lembre-se de que o arquivo dotfile é uma conveniência, não realmente para ocultar o arquivo por motivos de segurança, mas para reduzir a confusão de arquivos durante a listagem de arquivos. Está cozido lse as outras ferramentas.

Rich Homolka
fonte
E também é falso. Embora a remoção de permissões de leitura de um diretório impeça a listagem de seu conteúdo, a remoção da permissão de execução negará qualquer acesso ao diretório. Quando você não tem permissão para executar um diretório, não terá acesso a nada além dele. Nem mesmo se houver um subdiretório com todos os direitos e você souber o caminho.
Bachsau