- PR -

cpとmvの違い

1
投稿者投稿内容
いっそう
会議室デビュー日: 2005/03/19
投稿数: 9
投稿日時: 2005-11-12 18:43
WEBアプリケーションのインストール時に少し困った事象が発生しています。

ユーザfooでhogeアプリをインストールしようとします。
$wget http://www.hoge.com/hoge.1.2.3.tgz
$tar zxvf hoge.1.2.3.tgz
このときhoge.1.2.3ディレクトリが作成されるとします。

インストール方法としては展開したディレクトリを丸ごと公開するだけでよいとします。
apacheの公開ディレクトリ/var/www/htdocsとした場合、
$ mv hoge.1.2.3 /var/www/htdocs/hoge
(hogeに名前を変えて移動)
とすればよいと思うのですが、
HTTP経由でhttp://xxx/hoge/にアクセスすると403エラーが発生してしてしまいます。
Apacheのエラーログでは

[Sat Nov 12 18:31:54 2005] [error] [client 100.100.100.100] (13)Permission denied: access to /hoge/ denied

と出力されます。

mvコマンドの変わりに
$ cp -r hoge.1.2.3 /var/www/htdocs/hoge2
を実行してhttp://xxx/hoge2/にアクセスするとちゃんとhogeアプリが表示されます。

また、このときapacheの公開ディレクトリで"Option Indexes"を有効にして公開ディレクトリ直下を表示すると、hoge2ディレクトリのみが表示されます。

mvでディレクトを移動してきた場合、なぜ表示できないのでしょうか?

環境:
Apache/2.0.54 FedoraCore4
Java僧
ぬし
会議室デビュー日: 2003/11/06
投稿数: 261
投稿日時: 2005-11-12 18:49
mv だとオーナーが維持されますね。
cp は-p なしだとオーナーは維持されないです。
その *.tgz のパッケージは誰が作ったものですか?
いっそう
会議室デビュー日: 2005/03/19
投稿数: 9
投稿日時: 2005-11-12 19:05
早速の返信ありがとうございます。

> mv だとオーナーが維持されますね。
ほかの環境ではわかりませんが
私の環境では、一般ユーザでtarコマンド実行時にすべて
のファイルのオーナがtarコマンド実行ユーザに書き換わりました。

なので、cpでもmvでもfooユーザで実行しているため
最終的な/var/www/htdocs/hogeも/var/www/htdocs/hoge2もオーナーはfooになっております。
jk
ベテラン
会議室デビュー日: 2005/08/19
投稿数: 94
投稿日時: 2005-11-12 20:26
cpは -pが指定されていない場合 umaskが影響します umaskはどのような値が設定されていますか?

$umask[enter]
の結果はいかがでしょうか?

通常は 0022などの値が表示されると思いますが
0077,0055,0044などの値が設定されていると
readの権限が設定されないのでNGだとおもいます。

403=権限なし=error_logにも出力されていると思いますが...


また、ファイルをtarで固めるときにも pを指定しておけばオーナー情報を保持します。
ただし、スーパーユーザでないと正しく解凍できません...

ex)
$tar cvzpf tartest.tar.gz ./

[ メッセージ編集済み 編集者: jk 編集日時 2005-11-12 20:30 ]
いっそう
会議室デビュー日: 2005/03/19
投稿数: 9
投稿日時: 2005-11-14 13:25
umaskは0222でした。

これは、最終的な
/var/www/htdocs/hoge
/var/www/htdocs/hoge2
のパーミッションが異なっていて、Apacheの実行ユーザから読めないのではないかという指摘だと思いますが
パーミッションはhoge、hoge2ともにApacheの実行ユーザからread可能です。
以下のような構成で検証してみました。

Apache User/Group:apache/apache
作業ユーザ:foo/users

公開したいディレクトリ(/home/foo/hoge)
drwxr-xr-x foo users ~/hoge
-rw-r--r-- foo users ~/hoge/index.html

このときfooユーザで以下のコマンドを実行する。
$cp -r ~/hoge /var/www/htdocs/hoge1
$mv ~/hoge /var/www/htdocs/hoge2

そのときの/var/www/htdocs/hoge1,hoge2のパーミッションは
$ls -al hoge*
hoge1:
合計 60
drwxr-xr-x 2 foo users 4096 11月 14 12:45 .
drwxr-xr-x 8 foo users 4096 11月 14 12:45 ..
-rw-r--r-- 1 foo users 37372 11月 14 12:45 index.html

hoge2:
合計 60
drwxr-xr-x 2 foo users 4096 11月 14 12:44 .
drwxr-xr-x 8 foo users 4096 11月 14 12:45 ..
-rw-r--r-- 1 foo users 37372 11月 17 2004 index.html

です。
このときブラウザで表示すると
/hoge1はOK、/hoge2は403となります。
もうひとつ確認したことがこの状態のとき
# sudo -u apache cat /var/www/htdocs/hoge2/index.html
では、内容が表示されます。

httpdプロセスからのみ読めない状態?になっているようです。

当方の薄い知識では、ここまで調べた時点でもうお手上げです。

本サーバはディスクは一台なのですがFC4のデフォルトインストールを
進めていくとLVM構成でのインストールとなったため、
今後はLVMについて調べていこうと思うのですが、
なにぶん少ない知識で調べていくため、時間がかかると思われます。

類似現象などの経験がございましたら、ご教示いただけないでしょうか?


[ メッセージ編集済み 編集者: いっそう 編集日時 2005-11-14 13:27 ]
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-11-14 13:55
こんにちは。

パーミッションの問題ではなく、SELinuxのコンテキストの問題のように思います。
mv だと、移動前のラベルのまま ( i-node自体は変わっていないため ) ですが、cp の場合は新規にファイルが作成されるため、特に指定が無ければ、その場所にあったラベルになるはずです。
で、mv の場合には chcon コマンドの併用が必要だと思います。

 http://fedora.redhat.com/docs/selinux-apache-fc3/sn-using-other-types.html

辺りが、FC3の英語情報ぽいですが、参考になると思います。

以上、ご参考まで。

追記:
えーと…、ラベルではなくてタイプかもしれません。
ちょっと SELinux に関しては知識があやふやなため、用語が怪しいところがあります。何卒ご容赦を。

[ メッセージ編集済み 編集者: angel 編集日時 2005-11-14 13:59 ]
いっそう
会議室デビュー日: 2005/03/19
投稿数: 9
投稿日時: 2005-11-14 14:57
angelさん

返信ありがとうございます。
やはりSELinuxの問題だったようです。
rootで
# setenforce 0
(SELinuxを無効にするコマンドのようです。)
を実行し再度、ブラウザでアクセスしたところ
hoge1もhoge2も表示されることを確認しました。

見当違いの方向で調べるところだったので助かりました。(笑)

FC3中心ですが日本語の情報が
http://www.selinux.gr.jp/documents/FC3-SELinuxmemo.html
にありました。

もう少し、SELinuxについて勉強して適切なタイプで運用していこうと思います。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)