Alterar permissões para um link simbólico

37

Eu tenho um link simbólico com estas permissões:

lrwxrwxrwx 1 myuser myuser       38 Aug 18 00:36 npm -> ../lib/node_modules/npm/bin/npm-cli.js*

O link simbólico está localizado em um arquivo .tar.gz. Agora, quando descompacto o arquivo tar.gz usando o maven, o link simbólico não é mais válido. Estou, portanto, tentando reconstruir o link simbólico. Primeiro, crio o link simbólico usando ln, mas como faço para definir as mesmas permissões que o link simbólico original?

u123
fonte

Respostas:

59

Você pode criar um novo link simbólico e movê-lo para o local do link antigo.

ln -s <new_location> npm2
mv -f npm2 npm

Isso preservará a propriedade do link. Como alternativa, você pode usar chownpara definir a propriedade do link manualmente.

chown -h myuser:myuser npm

Na maioria dos sistemas, as permissões de link simbólico não importam. Ao usar o link simbólico, as permissões dos componentes do destino do link simbólico serão verificadas. No entanto, em alguns sistemas eles são importantes. O MacOS requer permissão de leitura no link para readlink, e a sympermopção de montagem do NetBSD força as verificações de permissões de link na leitura e passagem. Nesses sistemas (e seus parentes, incluindo FreeBSD e OpenBSD), existe uma -hopção equivalente a chmod.

chmod -h 777 npm
JdeBP
fonte
11
Acabei de encontrar um problema de permissão com links simbólicos em um servidor CentOS 6.8. Os links simbólicos tinham dono: grupo de raiz: raiz. Quando o proprietário e o grupo foram alterados para o usuário que possuía o diretório em que estavam, conforme mostrado nesta resposta, o problema de permissão desapareceu.
Night Owl
Apenas fornecendo um esclarecimento. Para alterar a propriedade ou os direitos em um link simbólico, o sinalizador -h afetará o arquivo de link simbólico em vez do arquivo não referenciado.
UltimaWeapon 15/07
12

Quando você tenta usar chmodpara definir as permissões do link, na verdade o que você faz é definir as permissões do destino do link. As permissões do link não fazem sentido.

Apenas faça
fonte
2
E se alguém alterar o link para um código malicioso? O código original pode até ser algo que o root pode acessar apenas. Por exemplo, em scripts crontap.
aliqandil
@aliqandil Geralmente, um usuário pode excluir e recriar qualquer arquivo em um diretório ao qual tenha acesso de gravação. No bash, para um arquivo testcom -rw-rw-r-- root root, pois rm testrecebo o prompt rm: remove write-protected regular empty file 'test'?A solução é colocar arquivos confidenciais em diretórios para os quais os usuários têm acesso somente leitura.
AnOccasionalCashew
5

Quando você tem um link como:

link -> foo/bar

e deseja alterá-lo para:

link -> new/target

Há dois casos a serem considerados:

  1. foo/barnão é um diretório ou não existe ou você não tem acesso à pesquisa foo. Então

    ln -s new/target link
    

    falhará porque linkjá existe, mas você pode superar isso usando o padrão:

    ln -fs new/target link
    
  2. foo/baré um diretório (e você tem permissão de pesquisa foopara poder determinar que foo/baré um diretório). Nesse caso, quando você faz:

    ln -s new/target link
    

    ou

    ln -fs new/target link
    

    Isso é entendido como a criação de um novo targetlink simbólico dentro do linkdiretório ( linké um diretório porque é um link simbólico para o foo/bardiretório). Então, você realmente criará um:

    foo/bar/target -> new/target
    

    Para superar isso, o GNU lntem uma -Topção para que o nome do link seja sempre considerado como nome do link, e não como um diretório para criar o (s) link (s). Portanto, com o GNU ln:

    ln -fsT new/target link
    

    vai funcionar. Como antes, ele removerá o linklink simbólico original e o criará novamente new/targetcomo o destino (e o processo 'euid e egid como o proprietário).

    O GNU lntambém tem uma -nopção. Funciona como, -Texceto quando, linkna verdade, é um diretório real; nesse caso, ele ainda criará o link simbólico dentro desse diretório (em vez de falhar com um erro).

    Portably, sua melhor opção é remover o link primeiro e depois recriá-lo:

    rm -f link && ln -s new/target link
    

Na maioria dos sistemas, as permissões nos links simbólicos são ignoradas e geralmente fixadas rwxrwxrwx.

Nos sistemas em que as permissões de link simbólico são importantes (como o OS / X, em que você precisa de permissão de leitura para um link simbólico para poder resolver seu destino), geralmente existe uma maneira de alterá-las ( chmod -hno OS / X).

A propriedade, embora como acima não seja relevante para o acesso ao arquivo apontado pelo link simbólico na maioria dos sistemas, pode ter alguma outra relevância no tbit do diretório pai ou das cotas ... ) e existe um comando padrão para alterá-lo:

chown -h user[:group] the-link
chgrp -h group the-link
Stéphane Chazelas
fonte
0

Se você realmente precisar alterar a permissão de links simbólicos (geralmente sem sentido, conforme escrito em outras respostas), obtive sucesso ao usar a -Ropção de chown:

chown -R myuser:mygroup link

Se -Rnão foi usado, as permissões não foram alteradas.

Miroslav Mocek
fonte
Isso funcionará com o GNU chownporque está -Rimplícito -Plá, no entanto, isso não é garantido e não funcionará em outras implementações de chown. A maneira padrão de alterar a propriedade do link simbólico é com a -hopção Acabei de atualizar a resposta aceita incorreta.
Stéphane Chazelas