シンボリックリンク権限を変更するには?

シンボリックリンク権限を変更するには?

問題があります。シンボリックリンクの権限を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

ベストアンサー1

一部のシステムはシンボリックリンクの権限変更をサポートしていますが、一部のシステムはサポートしていません。

  • 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::"),
                           長いオプション、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。 BSDなどのGNU coreutilsは、シンボリックリンクの所有権を変更する機能をサポートしています。これは、シンボリックリンクの所有権がリンクの内容を変更できるかどうか(および他の宛先を指すことができるかどうか)に関連しているため、他の機能です。繰り返しますが、これは元のBSD機能(OSX、FreeBSDなど)、これもサポートしていますLinux(そしてソラリス、等)。 POSIX とこれ特徴:

-h
シンボリックリンクタイプファイルの名前を指定する各ファイルオペランドに対して、chownはシンボリックリンクのユーザーIDを設定しようとします。グループIDを指定した場合、シンボリックリンクタイプのファイル名を指定する各ファイルオペランドに対して、chownはシンボリックリンクのグループIDを設定しようとします。

コマンドラインツール(およびシェルスクリプト)についてはこれです。ただし、次のことができます。書く独自のユーティリティを使用POSIXの特徴ユーティリティの議論では言及されていませんchmod

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

後者の関数はバナーパラメータは次のように記述されます。

バナーで定義されている次のリストのフラグのビットごとのORで構成されています<fcntl.h>

AT_SYMLINK_NOFOLLOW
もしシンボリックリンクの名前を指定し、シンボリックリンクのモードを変更します。

つまり、の目的は、fchmodatあなたが要求した機能を提供することです。ただし、コマンドラインchmodユーティリティ(これまで)はchmod次のログのみを記録します(この機能はありません)。

fchmodatちなみに、これはもともと10年前にRed HatとGNU開発者が採用し、標準化のために提案したSolarisの正しく文書化されていない機能だったようです。

~によるとLinuxプログラミングインターフェース、2.6.16以降、LinuxはAT_SYMLINK_NOFOLLOW次の呼び出しをサポートしています。faccessat、、、、fchownatfstatatutimensatlinkat2.6.18で実装されました(どちらも非常に「古い」:OSNewsによると、2006年)。

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

おすすめ記事