Ocultar arquivos no Linux sem usar o ponto

27

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

Existe uma maneira de fazer isso?

    
por aWebDeveloper 21.11.2011 / 15:32

9 respostas

23

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

Isto é puramente por conveniência, a. começar um nome de arquivo significa absolutamente nada, mas "o usuário provavelmente não quer ver isso o tempo todo". Para ter certeza de que você sabe, executando, por exemplo, ls -a mostrará todos os arquivos.

Se você não quiser ter um arquivo bagunçado em suas listas no Linux, você deve renomeá-lo para começar com um ponto (Bônus: isso também funcionará para o OS X, se estivermos falando de um dispositivo portátil) . Se você não quer que os usuários consigam encontrar um arquivo, você está fazendo errado - é para isso que as permissões são necessárias.

As permissões do Unix, como dizem respeito aos diretórios, muitas vezes confundem as pessoas, e talvez compreendê-lo melhor o ajudará. As permissões "ler" e "executar" ( r e x ) significam algo diferente para diretórios do que para arquivos. Para diretórios, a permissão execute x determina se você acessa ou não os inodes no diretório. A permissão r de leitura determina se você pode ou não acessar a listagem do diretório. Funcionalmente, x permite que o usuário faça as coisas em um diretório, enquanto a permissão r permite que eles vejam o que está nele. Estes são diferentes e a diferença pode ser confusa. Vamos ver 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 posso alterar o diretório ou ler os arquivos nele. Sem ler, 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, porém, que a remoção da permissão de leitura apenas oferece segurança por 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.

    
por 21.11.2011 / 18:59
21

Crie um arquivo .hidden no diretório com os nomes dos arquivos a serem ocultados (um nome para cada linha).

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

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

Agora, o comando ls não lista esses arquivos.

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

por 24.09.2014 / 10:43
13

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

  1. Crie um arquivo de texto chamado .hidden na pasta em que você 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.
por 04.02.2013 / 21:06
4

Um ponto é usado para esconder 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 tenham acesso a determinada pasta / arquivo. Tente experimentar com o comando chmod .

    
por 21.11.2011 / 16:24
2

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

Eu acredito que os únicos arquivos adicionais ocultos por qualquer gerenciador de arquivos Linux são arquivos de backup, ou seja, aqueles que terminam em um til ~ ou .bak ou o que eles acreditam ser a extensão de backup. Em qualquer caso, você provavelmente está com sorte se tudo o que você deseja é ocultar os arquivos de backup do gerenciador de arquivos.

Não forneça aos seus arquivos uma extensão de backup para ocultá-los ou eles podem ser excluídos acidentalmente !!

Como um aparte, você pode ocultar arquivos do Finder no Mac OS X usando o comando SetFile -a V [file] ou editando /.hidden , mas obviamente isso não ocultará o arquivo do programa ls da linha de comando.

    
por 21.11.2011 / 19:47
2

Se você tem algumas habilidades de programação e se apenas o que você precisa é esconder nomes de arquivos para conviniência do usuário para parar de confundir o espaço visual, você pode hacká-lo!

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

Existem muitas maneiras de armazenar essas informações:

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

      attr -s hidden -V true your_file
    
  2. Como mencionado acima, você pode armazenar a lista de nomes de arquivos em .hidden file

Importante: Isso não funcionará assim que você precisar implementar a lógica, os sistemas limpos apenas ignorarão .hidden arquivos e hidden atributos estendidos!

Além disso, existem várias implementações possíveis:

  1. Se você tiver apenas alguns arquivos, escreva no arquivo .bashrc

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

    man ls para mais informações.

  2. Escreva um function ls como ele lida com toda a lógica por trás do reconhecimento arquivos ocultos e lista de montagem de todas as entradas -I e, em seguida, executando /bin/ls com os devidos sinalizadores de ignorar. Tarefa muito laboriosa, porque você tem para manipular todos os parâmetros ls corretamente.

  3. Obtenha fontes de coreutils

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

    ou

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

    Corrigir da maneira que você precisa para lidar com a implementação de arquivos ocultos.  E coloque-o no seu PATH

    Eu o hackeei em menos de 5 minutos usando fontes inúteis 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)
    
por 14.07.2015 / 12:24
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 --ignore flags.

    
por 27.01.2016 / 22:40
2

Hoje em dia você pode escrever FUSE que oculta arquivos de acordo com a configuração dada.

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

getdir: int (*getdir) (const char *, fuse_dirh_t, fuse_dirfil_t);
This reads the contents of a directory. This operation is the opendir(), readdir(), …, closedir() sequence in one call. For each directory entry, the filldir() function should be called.

Eu não sou um programador, mas imagino que se pode fazer com que getdir omita todos os arquivos listados em (por exemplo) .hidden file. Se você implementar isso corretamente, todas as ferramentas (GUI ou não) serão afetadas.

    
por 26.02.2017 / 23:36
1

Você pode 'ocultar' o conteúdo de um diretório removendo 'x' perms 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 parece com o que você quer.

Tenha em mente que a coisa do dotfile é uma conveniência, não é realmente ocultar o arquivo por causa da segurança, mas reduzir a desordem dos arquivos durante a listagem de arquivos. Está cozido em ls e as outras ferramentas.

    
por 21.11.2011 / 16:40

Tags