web-dev-qa-db-ja.com

Ubuntu 14.04.3LTSでディレクトリを削除できません

以下に示すように、rootユーザーはmyappディレクトリを削除できませんが、このディレクトリ内のファイルの書き込みと削除はできます。ファイルシステムはext4です。これはファイルシステムの問題ですか?何かアイデアはありますか?

root@vm4923:/opt/Tomcat/webapps# ls -l | grep myapp
drwxr-xr-x  2 root root     4096 Feb 17 14:30 myapp
-rw-r--r--  1 root root 17544487 Dec 18 12:59 myapp.war

root@vm4923:/opt/Tomcat/webapps# rm -rf myapp
rm: cannot remove 'myapp': Permission denied

root@vm4923:/opt/Tomcat/webapps# Sudo rm -rf myapp
rm: cannot remove 'myapp': Permission denied

root@vm4923:/opt/Tomcat/webapps# ls -l myapp/
total 0

root@vm4923:/opt/Tomcat/webapps# echo "jsdkfjslkdj" > myapp/testfile

root@vm4923:/opt/Tomcat/webapps# ls -l myapp/
total 4
-rw-r--r-- 1 root root 12 Feb 17 14:38 testfile

root@vm4923:/opt/Tomcat/webapps# ls -lh | grep myapp
drwxr-xr-x  2 root root 4.0K Feb 17 14:38 myapp
-rw-r--r--  1 root root  17M Dec 18 12:59 myapp.war

root@vm4923:/opt/Tomcat/webapps# ls -l myapp/
total 4
-rw-r--r-- 1 root root 12 Feb 17 14:38 testfile

root@vm4923:/opt/Tomcat/webapps# rm -rf myapp
rm: cannot remove 'myapp': Permission denied

root@vm4923:/opt/Tomcat/webapps# ls -l myapp/
total 0
root@vm4923:/opt/Tomcat/webapps# ls -lh | grep myapp
drwxr-xr-x  2 root root 4.0K Feb 17 14:39 myapp
-rw-r--r--  1 root root  17M Dec 18 12:59 myapp.war
root@vm4923:/opt/Tomcat/webapps# 

@Fiximan

# ls -l | grep webapps
drwxrwxrwx 9 root root  4096 Jan 27 21:41 webapps

#chattr -i Exampコマンドを発行した後の@jcbermu lsattrの出力:

# lsattr 
-------------e-- ./myapp
-------------e-- ./Host-manager
-------------e-- ./myapp.war
-------------e-- ./examples
-------------e-- ./docs
-------------e-- ./examp
-------------e-- ./examp.war
-------------e-- ./ROOT
-------------e-- ./manager

解決策(編集)

最後に、問題の根本的な原因は、親ディレクトリのext4属性(アクセス許可ではない)にありました。

root@vm4923:/opt/Tomcat# lsattr | grep webapps
----i--------e-- ./webapps

iディレクトリからwebapps属性を削除することで、rm -rfコマンドを使用してmyappディレクトリを削除できるようになりました。

root@vm4923:/opt/Tomcat# chattr -i webapps

root@vm4923:/opt/Tomcat# lsattr | grep webapps
-------------e-- ./webapps

root@vm4923:/opt/Tomcat# cd webapps/

root@vm4923:/opt/Tomcat/webapps# ls
ROOT  docs  examp  examp.war  examples  Host-manager  manager  myapp  myapp.war

root@vm4923:/opt/Tomcat/webapps# ls myapp
testdir

root@vm4923:/opt/Tomcat/webapps# rm -rf myapp

root@vm4923:/opt/Tomcat/webapps# ls
ROOT  docs  examp  examp.war  examples  Host-manager  manager  myapp.war

頑張ってくれてありがとう!

2
funk

両方回答 を組み合わせるには:

親ディレクトリwebappsiまたはa属性 が設定されているかどうかを確認します

_lsattr | grep webapps
_

次に、を介してそれらを削除します

_chattr -i -a webapps
_
6
serv-inc

rootであることは、次のコマンドを発行するファイルの属性を確認します。

lsattr 

出力は次のようになります。

-----------------e- ./.thisfolder/.
-----------------e- ./.thisfolder/somefile

気づいたら、iまたはaで削除してください。

chattr -i [filename]
chattr -a [filename]

chattr ext2、ext3、およびext4ファイルシステムで、ACL(chmod、chown、setfacl…)をオーバーライドする属性を変更して、ファイルを厳密に制御できます。

最も一般的な属性は次のとおりです。

  • (A)時間を更新しないでください

  • (S)同期更新

  • (a)追加のみ

  • (d)ダンプなし

  • (i)不変

  • (j)データジャーナリング

  • (t)テールマージなし

lsattr単にそれらの属性をリストします。

3
jcbermu

ディレクトリ/ a/b/cを削除するには、/ a/b/cへの書き込み権限が必要であるというのはよくある誤解です。その権利を持つことで、/ a/b/cのコンテンツを操作することができます。つまり、その下のファイルを書き込み/変更/削除します。

したがって、/ a/b/cを削除するには、/ a/bに書き込みフラグが必要です。

2
Gombai Sándor