アプリ版:「スタンプのみでお礼する」機能のリリースについて

パーミッション変更作業中に
「chmod u-x .*」としたところ予期しない動作をしました。

私事ですが、
先日これで、サーバを停止させてしまい始末書を書きました。
原因はわかったのですがコマンドの動作に理解できずに困っています。

詳しい方がおられましたら、ご教授お願いします。
よろしくお願いします。

問題は、カレントディレクトリで
.(ドット)から始まる全てのファイルに対して
ユーザの実行権限を削除するということで
下記のコマンドを実行しました。
「chmod u-x .*」
その結果、親と親の親ディレクトリの
実行権限まで変わってしまったということです。

カレントディレクトリには、
下記のファイル(ディレクトリ)があります。
.
..
.bash_history
.bash_logout
.bash_profile
.bashrc

「..」が変更対象に含まれている為、
「../foo」親ディレクトリが変更対象になります。

「../bar」が変更対象に含まれないのは、
「..」でも直接親子関係にないから変更対象に入らない。
そのため、
「../../home」も同じ理由で親子関係にないから変更対象に入らない
と思っています。

確認した環境は
RHEL4とFedora6ですどちらも結果は同じ。

■下記に実行したコマンドを記載します。
(文字数に制限があるようなので、内容を一部加工させて頂きました。)

【コマンド入力前のパーミッション】
[root@baz /]# ls -la / | grep home
drwxr-xr-x 4 root root 4096 1月 9 1:01 home

[root@baz /]# ls -la /home
合計 28
drwxr-xr-x 4 root root 4096 日時 .
drwxr-xr-x 3 root root 4096 日時 ..
drwx--x--x 1 bar bar 4096 日時 bar
drwx------ 5 foo foo 4096 日時 foo

[root@baz foo]# ls -la
合計 40
drwx------ 5 foo foo 4096 日時 .
drwxr-xr-x 4 root root 4096 日時 ..
-rw------- 1 foo foo 165 日時 .bash_history
-rw-r--r-- 1 foo foo 24 日時 .bash_logout
-rw-r--r-- 1 foo foo 176 日時 .bash_profile
-rw-r--r-- 1 foo foo 124 日時 .bashrc
drwx------ 5 foo foo 4096 日時 Maildir
drwxr-xr-x 2 foo foo 4096 日時 etc
drwxr-xr-x 2 foo foo 4096 日時 public_html

【問題のコマンドを実行】
[root@baz foo]# pwd
/home/foo

[root@baz foo]# chmod u-x .*

【コマンド入力後のパーミッション】
[root@baz foo]# ls -la
合計 40
drw------- 5 foo foo 4096 日時 .
drw-r-xr-x 4 root root 4096 日時 ..
-rw------- 1 foo foo 165 日時 .bash_history
-rw-r--r-- 1 foo foo 24 日時 .bash_logout
-rw-r--r-- 1 foo foo 176 日時 .bash_profile
-rw-r--r-- 1 foo foo 124 日時 .bashrc
drwx------ 5 foo foo 4096 日時 Maildir
drwxr-xr-x 2 foo foo 4096 日時 etc
drwxr-xr-x 2 foo foo 4096 日時 public_html

[root@baz /]# ls -la /home
合計 28
drw-r-xr-x 4 root root 4096 日時 .
drwxr-xr-x 3 root root 4096 日時 ..
drwx--x--x 1 bar bar 4096 日時 bar
drw------- 5 foo foo 4096 日時 foo

[root@baz /]# ls -la / | grep home
drw-r-xr-x 4 root root 4096 日時 home

A 回答 (2件)

pwd = /home/foo だから、


. = /home/foo で、 .. = /home になります。

shell は、「.*」という入力を受けると、それを一致するファイル名に展開します。

すなわち、/home/foo下においては、
chmod u-x .* = chmod u-x . .. .bas以下略
を実行することでなるので、/homeは書き換わってしまいます。

echo .*

を実行してみては。

この回答への補足

「chmod u-x /home」も
「echo .*」の動作については理解していますが、
お恥ずかしながら
「.」と「..」ファイルについて認識が
Linuxを覚えた当初から間違っていたみたいですね。

ほとんどのサイトでこう紹介されています。
「.」 カレントディレクトリを意味します
「..」 一つ上のディレクトリを意味します。

なので私は、
「.」を「現在の作業しているディレクトリ」を指す
キーワードのように誤認していました。

実際には「.」と「..」の説明は
. 現在作業しているディレクトリの絶対パスの省略形
.. 一つ上のディレクトリの絶対パスの省略形
であり

カレントディレクトリが「/home/foo」で「cd .」のコマンドを実行した場合
で説明すると

「cd .」は「cd 現在作業しているディレクトリ」
その結果「カレントディレクトリの移動はなし」ということではなく

「cd .」とした場合、
「.」はカレントディレクトリ「/home/foo」のシンボリックリンクのような扱いの為
「cd /home/foo」を実行したのと同じであり
「作業ディレクトリを変更した結果、同じディレクトリに戻ってきた」ということですね。

補足日時:2011/02/20 02:58
    • good
    • 0
この回答へのお礼

私の説明不足もあり、欲しい答えとは少し異なっていましたが、
素早い回答どうもありがとうございました。

お礼日時:2011/02/20 23:46

>ほとんどのサイトでこう紹介されています。


>「.」 カレントディレクトリを意味します
>「..」 一つ上のディレクトリを意味します。

これは正しいです。

>なので私は、
>「.」を「現在の作業しているディレクトリ」を指す
>キーワードのように誤認していました。

キーワードというのは当たらないです。. .. はディレクトリ名です。

>実際には「.」と「..」の説明は
>. 現在作業しているディレクトリの絶対パスの省略形
>.. 一つ上のディレクトリの絶対パスの省略形
>であり

これは違います。省略形ではありません。

>カレントディレクトリが「/home/foo」で「cd .」のコマンドを実行した場合で説明すると

>「cd .」は「cd 現在作業しているディレクトリ」
>その結果「カレントディレクトリの移動はなし」ということではなく

「移動無しということではなく」という部分は合ってます。

>「cd .」とした場合、
>「.」はカレントディレクトリ「/home/foo」のシンボリックリンクのような扱いの為

「シンボリックリンクのような」はだいたい当たってます。
実際は、/home/foo/. は、 /home/foo のハードリンクです。

>「cd /home/foo」を実行したのと同じであり「作業ディレクトリを変更した結果、同じディレクトリに戻ってきた」ということですね。

これは合ってます。

i-node 及び ハードリンク について勉強されると理解が深まると思います。

この回答への補足

「.」と「..」の実態がハードリンクだと教えていただいたので早速コマンドで確認したところ確かにそうなっていました。

[root@baz /]# ls -ia1 / | grep home
13991937 home
[root@baz /]# ls -ia1 /home/
13991937 .
2 ..
13991938 bar
14843913 foo
[root@baz /]# ls -ia1 /home/foo/
14843913 .
13991937 ..
14843928 .bash_history
14843923 .bash_logout
14843920 .bash_profile
14843914 .bashrc
14843915 Maildir
14843921 etc
14843919 public_html

補足日時:2011/02/20 23:40
    • good
    • 0
この回答へのお礼

「i-node」もそうですけど、「ハードリンク」が答えの中で一番重要だったような気がします。
おかげ様でディレクトリ構造について理解が深まりました。

ありがとうございます。

お礼日時:2011/02/20 23:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!