Como alterar a permissão do Symlink?

6

Tenho um problema: preciso alterar a permissão do link simbólico de 777 para 755 e não tenho a menor ideia de como devo fazer isso. Eu tentei usar o comando chmod , mas não está funcionando. Eu quero

lrwxrwxrwx  1 frosu  2016_cluj     5 Jul  4 13:53 test6 -> test0

para

lrwxr-xr-x 1 frosu  2016_cluj     5 Jul  4 13:53 test6 -> test0
    
por JohnnyOnPc 04.07.2016 / 13:52

2 respostas

15

Alguns sistemas suportam a alteração da permissão de um link simbólico, outros não.

  • chmod - alterar modos de arquivo ou listas de controle de acesso (OSX e FreeBSD , usando -h )

    -h If the file is a symbolic link, change the mode of the link itself rather than the file that the link points to.

  • chmod - muda os bits do modo de arquivo (Linux)

    chmod never changes the permissions of symbolic links; the chmod system call cannot change their permissions. This is not a problem since the permissions of symbolic links are never used. However, for each symbolic link listed on the command line, chmod changes the permissions of the pointed-to file. In contrast, chmod ignores symbolic links encountered during recursive directory traversals.

Como o recurso é diferente, POSIX não menciona o possibilidade.

Nos comentários, alguém sugere que uma mudança recente no GNU coreutils fornece a opção -h . No momento, isso não aparece no código-fonte do chmod :

  while ((c = getopt_long (argc, argv,
                           ("Rcfvr::w::x::X::s::t::u::g::o::a::,::+::=::"
                            "0::1::2::3::4::5::6::7::"),
                           long_options, NULL))

e long_options tem isto:

static struct option const long_options[] =
{
  {"changes", no_argument, NULL, 'c'},
  {"recursive", no_argument, NULL, 'R'},
  {"no-preserve-root", no_argument, NULL, NO_PRESERVE_ROOT},
  {"preserve-root", no_argument, NULL, PRESERVE_ROOT},
  {"quiet", no_argument, NULL, 'f'},
  {"reference", required_argument, NULL, REFERENCE_FILE_OPTION},
  {"silent", no_argument, NULL, 'f'},
  {"verbose", no_argument, NULL, 'v'},
  {GETOPT_HELP_OPTION_DECL},
  {GETOPT_VERSION_OPTION_DECL},
  {NULL, 0, NULL, 0}
};

As permissões são definidas com chmod . A propriedade está definida com chown . Coreutils GNU (como o BSD) suporta a capacidade de alterar a propriedade de um link simbólico. Esse é um recurso diferente, já que a propriedade de um link simbólico está relacionada à possibilidade de modificar o conteúdo do link (e apontá-lo para um destino diferente). Novamente, isso começou como um recurso do BSD (OSX, FreeBSD , etc), que também é suportado com o Linux (e Solaris , etc). POSIX diz sobre este :

-h
For each file operand that names a file of type symbolic link, chown shall attempt to set the user ID of the symbolic link. If a group ID was specified, for each file operand that names a file of type symbolic link, chown shall attempt to set the group ID of the symbolic link.

Tanto para as ferramentas de linha de comando (e shell scripts). No entanto, você poderia escrever seu próprio utilitário, usando um recurso do POSIX que não é mencionado na discussão do utilitário chmod :

int chmod(const char *path, mode_t mode);
int fchmodat(int fd, const char *path, mode_t mode, int flag);

A última função adiciona um parâmetro flag , que é descrito assim:

Values for flag are constructed by a bitwise-inclusive OR of flags from the following list, defined in <fcntl.h>:

AT_SYMLINK_NOFOLLOW
If path names a symbolic link, then the mode of the symbolic link is changed.

Ou seja, o objetivo de fchmodat é fornecer o recurso que você perguntou. Mas a linha de comando chmod utility está documentada (até agora) apenas em termos de chmod (sem esse recurso).

fchmodat , a propósito, parece ter começado como um recurso mal documentado do Solaris que foi adotado pelos desenvolvedores da Red Hat e da GNU dez anos atrás, e sugerido por eles para padronização:

De acordo com A Interface de Programaçà £ o Linux , desde o 2.6.16, o Linux suporta AT_SYMLINK_NOFOLLOW nessas chamadas: faccessat , fchownat , fstatat , utimensat e linkat foi implementado em 2.6.18 (ambos em vez de "old": 2006, de acordo com OSNews ).

Se o recurso é útil ou não, depende dos sistemas que você está usando.

    
por 04.07.2016 / 13:58
3

A permissão para links simbólicos não é avaliada.

Antigamente, não havia como alterar os bits de permissão para links simbólicos.

Desde há algum tempo, o POSIX introduziu fchmodat() e todas as plataformas que suportam esta chamada, são capazes de alterar os bits de permissão para links simbólicos.

Não espere que isso tenha efeitos no symlink.

    
por 04.07.2016 / 14:27