web-dev-qa-db-ja.com

Symlink権限を変更するにはどうすればよいですか?

問題があります。シンボリックリンクのアクセス許可を777から755に変更する必要があります。どうすればよいのかわかりません。 chmodコマンドを使用してみましたが、機能しません。が欲しいです

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

lrwxr-xr-x 1 frosu  2016_cluj     5 Jul  4 13:53 test6 -> test0
7
JohnnyOnPc

シンボリックリンクのアクセス許可の変更をサポートするシステムとサポートしないシステムがあります。

  • chmod-ファイルモードまたはアクセス制御リストを変更 (OSXおよび FreeBSD 、_-h_を使用)

    _-h_ファイルがシンボリックリンクの場合、リンクが指すファイルではなく、リンク自体のモードを変更します。

  • chmod-ファイルモードビットの変更 (Linux)

    chmodがシンボリックリンクのアクセス許可を変更することはありません。 chmodシステムコールは、権限を変更できません。シンボリックリンクの許可は決して使用されないため、これは問題ではありません。ただし、コマンド行にリストされているシンボリックリンクごとに、chmodはポイントされたファイルのアクセス許可を変更します。対照的に、chmodは再帰的なディレクトリ走査中に遭遇したシンボリックリンクを無視します。

機能が異なるため、 [〜#〜] posix [〜#〜] は可能性について言及していません。

コメントから、誰かがGNU coreutilsへの最近の変更が_-h_オプションを提供することを示唆しています。現時点では、それは 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))

そして _long_options_ にはこれがあります:

_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}
};
_

権限はchmodで設定されます。所有権はchownで設定されます。 GNU coreutils(BSDなど)は、シンボリックリンクの所有権を変更する機能をサポートします。シンボリックリンクの所有権は、リンクのコンテンツを変更できるかどうかに関係するため、これは別の機能です(そして、それを別のターゲットに向けます。)これも、BSD機能(OSX、 FreeBSD など)として始まりました。これは Linux (および- Solaris など) POSIXはthis機能について

_-h_
タイプシンボリックリンクのファイルを指定する各ファイルオペランドについて、chownはシンボリックリンクのユーザーIDを設定しようとします。グループIDが指定されている場合、タイプシンボリックリンクのファイルを指定するファイルオペランドごとに、chownはシンボリックリンクのグループIDを設定しようとします。

コマンドラインツール(およびシェルスクリプト)についてはこれくらいです。ただし、chmodユーティリティの説明では言及されていない POSIXの機能 を使用して、独自のユーティリティをwriteできます。

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

後者の関数はflagパラメータを追加します。

flagの値は、_<fcntl.h>_で定義された次のリストからのフラグのビット単位の包含ORによって構築されます。

_AT_SYMLINK_NOFOLLOW_
pathがシンボリックリンクを指定している場合、シンボリックリンクのモードが変更されます。

つまり、fchmodatの目的は、あなたが尋ねた機能を提供することです。ただし、コマンドラインのchmodユーティリティは、(これまでのところ)chmodの観点からのみドキュメント化されています(この機能はありません)。

ところで、fchmodatは、10年前にRed HatおよびGNU開発者によって採用され、提案されたSolarisの不十分に文書化された機能として始まったようです標準化のため:

The Linux Programming Interface によると、2.6.16以降、Linuxはこれらの呼び出しで_AT_SYMLINK_NOFOLLOW_をサポートしています: faccessatfchownatfstatatutimensat 、およびlinkatは2.6.18で実装されました(どちらも「古い」: 2006、OSNewsによると )。

この機能が役立つかどうかは、使用しているシステムによって異なります。

15
Thomas Dickey

シンボリックリンクの許可は評価されません。

以前は、シンボリックリンクの許可ビットを変更する方法はありませんでした。

しばらくして、POSIXはfchmodat()を導入しました。この呼び出しをサポートするすべてのプラットフォームは、シンボリックリンクの許可ビットを変更できます。

ただし、これがシンボリックリンクに影響を与えるとは思わないでください。

3
schily