web-dev-qa-db-ja.com

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

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

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

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

39
u123

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

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

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

chown -h myuser:myuser npm

ほとんどのシステムでは、シンボリックリンクの権限は重要ではありません。シンボリックリンクを使用する場合、シンボリックリンクのターゲットのコンポーネントの権限がチェックされます。ただし、一部のシステムでは問題になります。 MacOSはreadlinkのリンクに対する読み取り権限を必要とし、NetBSDのsympermマウントオプションは読み取りと全探索のリンク権限チェックを強制します。それらのシステム(およびFreeBSDやOpenBSDを含むそれらの親戚)には、chmodと同等の-hオプションがあります。

chmod -h 777 npm
63
user26112

chmodを使用してリンクの権限を設定しようとする場合、実際に行うのはリンクのターゲットの権限を設定することです。リンクの権限は無意味です。

12
Just Do It

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

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/barがディレクトリであることを確認するには、fooに対する検索権限があります)。その場合、次のことを行います。

    ln -s new/target link
    

    または

    ln -fs new/target link
    

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

    foo/bar/target -> new/target
    

    これを克服するために、GNU lnには、リンク名を常にリンク名と見なすための-Tオプションがあり、リンクを作成するためのディレクトリではありません( s)in。したがって、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など)では、通常、それらを変更する方法があります(OS/Xではchmod -h)。

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

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

シンボリックリンクの権限を変更する必要がある場合(他の回答に記載されているように、通常は無意味です)、chown-Rオプションを使用して成功しました:

chown -R myuser:mygroup link

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

0
Miroslav Mocek