シンボリックリンクのアクセス許可を変更する


37

これらの権限を持つシンボリックリンクがあります。

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

シンボリックリンクは.tar.gzアーカイブにあります。これで、mavenを使用してtar.gzアーカイブを解凍すると、シンボリックリンクが無効になります。したがって、シンボリックリンクを再構築しようとしています。最初にlnを使用してシンボリックリンクを作成しますが、元のシンボリックリンクと同じ権限を設定するにはどうすればよいですか?

回答:


59

新しいシンボリックリンクを作成して、古いリンクの場所に移動できます。

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

これにより、リンクの所有権が保持されます。または、chownリンクの所有権を手動で設定するために使用できます。

chown -h myuser:myuser npm

ほとんどのシステムでは、シンボリックリンクのアクセス権は重要ではありません。シンボリックリンクを使用すると、シンボリックリンクのターゲットのコンポーネントの権限がチェックされます。ただし、一部のシステムでは重要です。MacOSはのリンクの読み取り許可を必要readlinkとし、NetBSDのsympermマウントオプションは読み取りとトラバーサルのリンク許可チェックを強制します。それらのシステム(およびFreeBSDやOpenBSDを含むそれらの関連システム)には、に同等の-hオプションがありchmodます。

chmod -h 777 npm

1
CentOS 6.8サーバー上のシンボリックリンクでアクセス許可の問題が発生しました。シンボリックリンクには、root:rootのowner:groupがありました。この回答に示されているように、所有者とグループが、そのディレクトリを所有していたユーザーに変更されると、アクセス許可の問題はなくなりました。
夜フクロウ

明確にするだけです。シンボリックリンクの所有権または権利を変更するために、-hフラグは、参照解除されたファイルではなく、シンボリックリンクファイルに影響します。
UltimaWeapon

12

chmodリンクの許可を設定するために使用しようとすると、実際に行うのは、リンクのターゲットの許可を設定することです。リンクの許可は無意味です。


2
誰かが悪意のあるコードへのリンクを変更したらどうなりますか?元のコードは、rootのみがアクセスできるものにすることもできます。たとえば、crontapスクリプトで。
-aliqandil

@aliqandil通常、ユーザーは書き込みアクセス権があるディレクトリ内のファイルを削除および再作成できます。bashで、ファイルをtest持つ-rw-rw-r-- root rootために、rm test私はプロンプトを受け取るrm: remove write-protected regular empty file 'test'?ソリューションは、ユーザがアクセスのみを読んでいるいるディレクトリ内の機密ファイルを配置することです。
AnOccasionalCashew

5

次のようなリンクがある場合:

link -> foo/bar

に変更したい:

link -> new/target

考慮すべき2つのケースがあります。

  1. foo/barはディレクトリではないか、存在しないか、に検索アクセスできませんfoo。それから

    ln -s new/target link
    

    link既に存在するため失敗しますが、標準を使用することでそれを克服できます:

    ln -fs new/target link
    
  2. foo/barはディレクトリです(そして、それがディレクトリであるfooかどうかを判断できる検索許可を持っていますfoo/bar)。その場合、次のことを行います。

    ln -s new/target link
    

    または

    ln -fs new/target link
    

    これは、ディレクトリtarget内に新しいシンボリックリンクを作成するものとして理解されますlinklinkディレクトリへのシンボリックリンクであるため、foo/barディレクトリです)。したがって、実際に作成します:

    foo/bar/target -> new/target
    

    それを克服するために、GNUがlnあり-T。常にGNUで、リンク名としてではなく、そうでリンクを作成するためのディレクトリとみなすことへのリンク名のオプションをln

    ln -fsT new/target link
    

    働くでしょう。以前と同様に、元のlinkシンボリックリンクを削除new/targetし、ターゲットとして(およびプロセスのeuidとegidを所有者として)新たに作成します。

    GNU lnには-nオプションもあります。-Tいつlink実際に実際のディレクトリであるかを除いて動作しますが、その場合、エラーで失敗する代わりに、そのディレクトリ内にシンボリックリンクが作成されます。

    移植性の高い方法としては、最初にリンクを削除してから再作成するのが最善の方法です。

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

ほとんどのシステムでは、シンボリックリンクの許可は無視され、通常はに固定されていrwxrwxrwxます。

シンボリックリンクのアクセス許可が重要なシステム(OS / Xのように、ターゲットを解決するためにシンボリックリンクの読み取り許可が必要な場合)では、一般にそれらを変更する方法があります(chmod -hOS / Xの場合)。

所有権は、上記のように、ほとんどのシステムでシンボリックリンクが指すファイルへのアクセスには関係ありませんが、親ディレクトリまたはクォータのビットに対して他の関連性を持つことができますt...)、それを変更する標準コマンドがあります:

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

0

シンボリックリンクの許可を変更する必要がある場合(他の回答に書かれているように、通常は意味がありません)、-Rオプションの使用に成功しましたchown

chown -R myuser:mygroup link

-R使用されなかった場合、権限は変更されませんでした。


GNUで機能するchownことは-R暗黙に示されて-Pいるため動作しますが、それは保証されておらず、他のいくつかの実装では動作しません。シンボリックリンクの所有権を変更する標準的な方法は、-hオプションを使用することです。受け入れられた回答を更新しましたが、これは間違っていました。
ステファンシャゼル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.