OS X El CapitanのPerlの問題

OS X El CapitanのPerlの問題

奇妙な理由で、OS Xで突然次のように表示されます。

Can't locate strict.pm:   Permission denied at /usr/bin/shasum5.18 line 100.
BEGIN failed--compilation aborted at /usr/bin/shasum5.18 line 100.

Homebrewでプレイするとき(brew doctorたとえば)

私はそれがHomebrewではなくAppleに関連していると確信しています。いつものように、私は他の* nixと比較して権限を処理するAppleのロジックを決して理解していませんでした!

以前は、一般ユーザーとして次のコマンドを実行できました。

% perl -V

これでrootとして実行する必要がありますが、非常に迷惑です。私も知らないうちに何かが起こっていた。

通常のユーザーとしてコマンドを実行すると、次の結果が表示されます。

% /usr/bin/perl -V
Can't locate Config.pm:   Permission denied.
BEGIN failed--compilation aborted.

誰かが通常のユーザーとしてこのコマンドを実行するのに役立つことができれば幸いです。

ご協力ありがとうございます。


@thrig、Arkadiusz Drabczyk教授に感謝します!

これが私がしたことです:

% /usr/bin/perl -le 'print for @INC' | while read d; do ls -ld -- "$d"; done
drwxr-xr-x  6 root  wheel  204  1 fév 10:59 /Library/Perl/5.18/darwin-thread-multi-2level
drwxr-xr-x  4 root  wheel  136 17 sep  2015 /Library/Perl/5.18
ls: /Network/Library/Perl/5.18/darwin-thread-multi-2level: No such file or directory
ls: /Network/Library/Perl/5.18: No such file or directory
ls: /Library/Perl/Updates/5.18.2: Permission denied
drwxr-xr-x  56 root  wheel  1904 25 mai 15:03 /System/Library/Perl/5.18/darwin-thread-multi-2level
drwxr-xr-x  130 root  wheel  4420 23 aoû  2015 /System/Library/Perl/5.18
drwxr-xr-x  66 root  wheel  2244 17 sep  2015 /System/Library/Perl/Extras/5.18/darwin-thread-multi-2level
drwxr-xr-x  109 root  wheel  3706 23 aoû  2015 /System/Library/Perl/Extras/5.18
drwx------+ 37 Nathalie  staff  1258  8 jui 22:26 .

良い主!犯人はアウトプットだ/Library/Perl/Updates/5.18.2!信じられない!

幸いなことに、私はPerl全体を使用して他のシステムから得られた権限と関連する権限を比較することができました。

その後、新しい権限をインストールしました。

sudo chmod 775 /Library/Perl/Updates

これでperl -V、通常のユーザーとしてプレイを始めることができます。

答え1

これは、Appleの問題、ホームブレークがベンダー@INCから提供された変更を誤って変更したり、/usr/bin/perl一部のユーザーエラーが原因で発生する可能性があります。モジュールを見つけるための@INCパスのリストなのでperl

% perl -E 'say for @INC'
/Users/jhqdoe/perl5/lib/perl5/darwin-thread-multi-2level
/Users/jhqdoe/perl5/lib/perl5
/opt/local/lib/perl5/site_perl/5.26/darwin-thread-multi-2level
/opt/local/lib/perl5/site_perl/5.26
...

PATHこれは私が最初に使用したMacPortバージョンです。

% /usr/bin/perl -E 'say for @INC'
/Users/jhqdoe/perl5/lib/perl5/darwin-thread-multi-2level
/Users/jhqdoe/perl5/lib/perl5
/Library/Perl/5.18/darwin-thread-multi-2level
/Library/Perl/5.18
/Network/Library/Perl/5.18/darwin-thread-multi-2level
/Network/Library/Perl/5.18
...

最初の2つのパスはlocal::lib他の設定がある場合とない場合があります。とにかく、これはエラーメッセージであるため、各ディレクトリに対して権限の問題を見つける必要があります。何かが破損して実行して内容をperl確認できない場合、問題になることがあります。@INC私のシステムを壊す時間です。

% chmod 000 /Users/jhqdoe/perl5/lib/perl5
% perl -E 'say for @INC'
Can't locate feature.pm:   /Users/jhqdoe/perl5/lib/perl5/feature.pm: Permission denied.
BEGIN failed--compilation aborted.

モジュールをロードしない古い形式(例feature.pm:)を実行するか、破損していないインストールで実行してから、破損したシステムperl -Vでそのパスを確認するのが役立ちます。perlここでは、以前の形式のコードを使用してパスのリストを取得できます。

% perl -le 'print for @INC' | while read d; do ls -ld -- "$d"; done
d---------  111 jhqdoe  nsd  3774 Jun  1 10:44 /Users/jhqdoe/perl5/lib/perl5
...

このエラーは非常に明白です。他のシステムでは、誰かが誤って設定されているか、誤ったグループ/権限/Usersを持つ微妙な問題(セカンダリグループが適用されないなど)がある可能性があるため、パス内のすべてのディレクトリに対する権限を確認する必要があるかもしれません。素晴らしいファイルシステムACLが関連しています。繰り返しますが、これはパス内のすべてのディレクトリにある可能性があります。

% chmod 750 /Users/jhqdoe/perl5/lib/perl5

さて、別の方法で分析してみましょう。 Appleゾーンには、ランダムな変更(悪いか悪い)を防ぐためのセキュリティ制限がある可能性があるため、今回はMacPortsのインストールを中止します。

% sudo chmod 000 "$(perl -Mstrict -E 'say $INC{"strict.pm"}')"
% perl -Mstrict -E 'say "borked?"'
Can't locate strict.pm:   /opt/local/lib/perl5/5.26/strict.pm: Permission denied.
BEGIN failed--compilation aborted.

解決策は同じです。すべてのディレクトリパスと@INCロードするモジュールの名前(ここ)を調べて、権限の問題を修正してください。複数のエラーがある可能性があります。表示されているファイルシステムのパスを見つけるのに役立つように、システムトレースツール(またはLinuxの場合)を使用する必要があります。perlstrict.pmdtracestraceperl

% sudo chmod 644 /opt/local/lib/perl5/5.26/strict.pm

そうでない場合はstrict.pm、他の問題であり、重要なファイルが削除されたか、インストールが正しくない、ハードドライブにエラーが発生した、または奇妙なオペレーティングシステム(RedHat Linuxなど)を使用していることを示している可能性があります。 )perlサプライヤーがさまざまなパッケージに切り詰めたものです。

関連情報