Modifica le autorizzazioni per un collegamento simbolico


37

Ho un link simbolico con queste autorizzazioni:

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

Il link simbolico si trova in un archivio .tar.gz. Ora, quando decomprimo l'archivio tar.gz usando Maven, il collegamento simbolico non è più valido. Sto quindi cercando di ricostruire il collegamento simbolico. Per prima cosa creo il collegamento simbolico usando ln, ma come posso impostare le stesse autorizzazioni del collegamento simbolico originale?

Risposte:


59

È possibile creare un nuovo collegamento simbolico e spostarlo nella posizione del collegamento precedente.

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

Ciò preserverà la proprietà del collegamento. In alternativa, è possibile utilizzare chownper impostare manualmente la proprietà del collegamento.

chown -h myuser:myuser npm

Sulla maggior parte dei sistemi, le autorizzazioni del collegamento simbolico non contano. Quando si utilizza il collegamento simbolico, verranno verificate le autorizzazioni dei componenti della destinazione del collegamento simbolico. Tuttavia, su alcuni sistemi sono importanti. MacOS richiede l'autorizzazione di lettura sul collegamento readlinke l' sympermopzione di montaggio di NetBSD impone i controlli delle autorizzazioni di collegamento su lettura e attraversamento. Su quei sistemi (e sui loro parenti, inclusi FreeBSD e OpenBSD) esiste -hun'opzione equivalente a chmod.

chmod -h 777 npm

1
Ho appena riscontrato un problema di autorizzazione con collegamenti simbolici su un server CentOS 6.8. I symlink avevano il proprietario: gruppo di root: root. Quando il proprietario e il gruppo sono stati cambiati con l'utente che possedeva la directory in cui si trovavano, come mostrato in questa risposta, il problema con l'autorizzazione è scomparso.
Gufo notturno il

Basta fornire un chiarimento. Per modificare la proprietà o i diritti su un collegamento simbolico, il flag -h influirà sul file del collegamento simbolico anziché sul file con riferimento.
UltimaWeapon,

12

Quando si tenta di utilizzare chmodper impostare le autorizzazioni del collegamento, in realtà si esegue l'impostazione delle autorizzazioni della destinazione del collegamento. Le autorizzazioni del collegamento non hanno senso.


2
Cosa succede se qualcuno modifica il collegamento in un codice dannoso? Il codice originale può anche essere qualcosa a cui solo root può accedere. Ad esempio negli script crontap.
Aliqandil,

@aliqandil Generalmente un utente può eliminare e ricreare qualsiasi file in una directory per la quale ha accesso in scrittura. In bash, per un file testcon -rw-rw-r-- root root, perché rm testricevo il prompt rm: remove write-protected regular empty file 'test'?La soluzione è posizionare i file sensibili nelle directory per le quali gli utenti hanno accesso in sola lettura.
AnOccasionalCashew

5

Quando hai un link come:

link -> foo/bar

e vuoi cambiarlo in:

link -> new/target

Vi sono due casi da considerare:

  1. foo/barnon è una directory o non esiste o non hai accesso alla ricerca foo. Poi

    ln -s new/target link
    

    fallirà perché linkesiste già, ma puoi superarlo usando lo standard:

    ln -fs new/target link
    
  2. foo/barè una directory (e si dispone dell'autorizzazione di ricerca fooper poter determinare che si foo/bartratta di una directory). In tal caso, quando lo fai:

    ln -s new/target link
    

    o

    ln -fs new/target link
    

    Questo è inteso come la creazione di un nuovo targetlink simbolico all'interno della linkdirectory ( linkè una directory perché è un link simbolico alla foo/bardirectory). Quindi creerai effettivamente un:

    foo/bar/target -> new/target
    

    Per ovviare a questo, GNU lnha -Tun'opzione per il nome del collegamento da considerare sempre come nome del collegamento, e non come una directory in cui creare i collegamenti. Quindi, con GNU ln:

    ln -fsT new/target link
    

    funzionerà. Come prima, rimuoverà il linklink simbolico originale e lo creerà di nuovo new/targetcome target (e il processo 'euid ed egid come proprietario).

    GNU lnha anche -nun'opzione. Funziona come -Tse non linkfosse effettivamente una directory reale, nel qual caso creerà comunque il link simbolico all'interno di quella directory (invece di fallire con un errore).

    Portabilmente, l'opzione migliore è rimuovere prima il collegamento e quindi ricrearlo:

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

Nella maggior parte dei sistemi, le autorizzazioni per i collegamenti simbolici vengono ignorate e generalmente risolte rwxrwxrwx.

Sui sistemi in cui sono importanti le autorizzazioni per il collegamento simbolico (come OS / X in cui è necessario disporre dell'autorizzazione in lettura per un collegamento simbolico per poterne risolvere il target), in genere esiste un modo per modificarle ( chmod -hsu OS / X).

La proprietà, sebbene come sopra non rilevante per l'accesso al file indicato dal link simbolico sulla maggior parte dei sistemi, può avere qualche altra rilevanza rispetto al tbit della directory o delle quote parent ... ) e c'è un comando standard per cambiarlo:

chown -h user[:group] the-link
chgrp -h group the-link

0

Se hai davvero bisogno di cambiare l'autorizzazione dei link simbolici (di solito insignificanti, come scritto in altre risposte), ho avuto successo con l'uso -Rdell'opzione di chown:

chown -R myuser:mygroup link

Se -Rnon è stato utilizzato, le autorizzazioni non sono state modificate.


Funzionerà con GNU chownperché -Rimplicito -Plì, tuttavia ciò non è garantito e non funzionerà in altre implementazioni di chown. Il modo standard per modificare la proprietà del collegamento simbolico è con l' -hopzione. Ho appena aggiornato la risposta accettata che non era corretta.
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.