web-dev-qa-db-ja.com

ディレクトリの権利は正しいのに、mvの使用時にアクセス許可が拒否されるのはなぜですか?

Musicを介してフォルダーmvを移動しようとすると、アクセス許可が拒否されますが、ディレクトリの所有者は私のユーザーに設定され、ユーザーのアクセス許可は7に設定されています。

(私はSudoを使用できることを知っていますが、何が問題なのかを知りたいです。何かが怪しい臭いがします)。 Ps:私はMac OS X El Capitanを使用しています。

Terminal screenshot

12
Timo

フォルダabcに移動すると、aのフォルダ権限によって、実行できることが決まります。

この場合、.が最も重要です。

権限が単にrwxよりも複雑であることを確認してください。 musicフォルダには@最後に.フォルダには+ 最後に。

  • 使用する xattr -h @記号の複雑な権限を決定します。
  • +記号のACLを判別するには、getfaclを使用します。
20
Konerak

LinuxにはWindowsサブシステムを使用していました。別のbashインスタンスでディレクトリを開いていました。それを閉じると、ディレクトリが移動します。

15
Chris Anderson

そのディレクトリのどこかに、少なくとも1つのファイルがあり、適切な権限がありませんでした。

だから、私がしたことは:

Sudo chown -R valmar ./Music
Sudo chmod -R 755 ./Music

今では動作します。

9
Timo

ここでの問題は、Musicフォルダーのアクセス制御リスト(ACL)に関係している可能性があります。 ACLは、通常ls -lでリストされる通常のPOSIXのものとは別の権限システムです。ホームフォルダーおよび他の場所にある他のいくつかのディレクトリにもACLがあります。

ホームディレクトリ内のACLを表示するには、次を使用します。

/bin/ls -le ~

おそらく、Musicディレクトリに対して0: group:everyone deny deleteのようなルールが表示されます。お気づきのように、Sudoで問題を上書きできます。それをしたくない場合(またはできない場合)、ファイルの所有者であれば、他のオプションがあります。インデックス(上記の例では0)に基づいて、MusicディレクトリのACLから問題のエントリを削除できます。

/bin/chmod -a# 0 Music

または、ACLのすべてのエントリを削除できます。

/bin/chmod -N Music

これで、ディレクトリを移動できます(通常のPOSIX権限が必要です)。移動後にACLを元に戻す場合は、次を使用できます。

/bin/chmod +a "group:everyone deny delete" Music_tmp

もう一度/bin/ls -leを使用して、ACLが適切であることを確認します。詳細については、man chmodのACLの例をご覧ください。特に、このイントロは役に立ちます:

各ファイルには1つのACLがあり、エントリの順序付きリストが含まれています。各エントリはユーザーまたはグループを参照し、一連の権限を付与または拒否します。ユーザーとグループが同じ名前で存在する場合、名前のタイプを指定するために、ユーザー/グループ名の前に「user:」または「group:」を付けることができます。

ACLの順序

Manページは順序付けに関する規則を説明しているとは思いませんが、 このページ はACLの順序規則を明確に説明しています。特に、明示的なdenyルールの前に、明示的なallowルールが適用されます。そのため、group:everyone deny deleteエントリが配置されている限り、allowルールを使用して削除する権限をユーザーに与えることはできません。これは、あなたを含むeveryoneグループへのアクセスが拒否され、そのルールが最初に適用されるためです。

4
spinup

削除しようとしたディレクトリで一連のプログラムが実行されていると、この問題が発生しました。ディレクトリを移動するには、まずそのディレクトリから実行中のすべてのプログラムを強制終了する必要がありました。

次のコマンドでは、プログラムの名前の選択方法について非常に注意してくださいにしてください。参考のために、次のコマンドを使用しました。

ps aux | grep -i [NAME_OF_ANNOYING_PROGRAM] | grep -v grep
# make sure that you are only about to kill the programs you want to kill

ps aux | grep -i [NAME_OF_ANNOYING_PROGRAM] | grep -v grep | awk '{print $2}' | Sudo xargs kill -9
Sudo mv /usr/local/[DIR_FOR_ANNOYING_PROGRAM] /usr/local/[DIR_FOR_ANNOYING_PROGRAM]2

一般的な手順は次のとおりです。

  1. 問題のディレクトリから実行中のすべてのプログラムを強制終了します
  2. ディレクトリの名前を変更しようとする
  3. それが失敗した場合は、強制終了(kill -9多くの注意)すべてのプログラムをディレクトリから
  4. ディレクトリの名前を変更しようとする
  5. それが失敗した場合は、プログラムが再度実行されているかどうかを確認してください。別のディレクトリから実行されているデーモンプログラムによって再起動されたこと
  6. 迷惑なプログラムを再起動するデーモンプログラムを強制終了します
  7. 迷惑なプログラムを強制終了する
  8. ディレクトリの名前を変更
  9. 利益
3
WattsInABox

これは、内部のファイルの1つが書き込み保護されている場合にも発生する可能性があります。今日、access.logは、すでに停止されているApacheに対して書き込み保護されていました。このファイルを削除したので、さらに親ディレクトリを移動することができました。

0
vintproykt