パーミッション変更作業中に
「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
No.2ベストアンサー
- 回答日時:
>ほとんどのサイトでこう紹介されています。
>「.」 カレントディレクトリを意味します
>「..」 一つ上のディレクトリを意味します。
これは正しいです。
>なので私は、
>「.」を「現在の作業しているディレクトリ」を指す
>キーワードのように誤認していました。
キーワードというのは当たらないです。. .. はディレクトリ名です。
>実際には「.」と「..」の説明は
>. 現在作業しているディレクトリの絶対パスの省略形
>.. 一つ上のディレクトリの絶対パスの省略形
>であり
これは違います。省略形ではありません。
>カレントディレクトリが「/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
「i-node」もそうですけど、「ハードリンク」が答えの中で一番重要だったような気がします。
おかげ様でディレクトリ構造について理解が深まりました。
ありがとうございます。
No.1
- 回答日時:
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」を実行したのと同じであり
「作業ディレクトリを変更した結果、同じディレクトリに戻ってきた」ということですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Makefileのechoの展開について 2 2022/07/26 07:35
- その他(プログラミング・Web制作) zshの例外処理 1 2022/06/02 16:36
- UNIX・Linux Kali Linuxで起動できない - Minimal BASH Like Line Editing 1 2022/06/03 13:14
- UNIX・Linux linuxサーバーのキャッシュをクリアするコマンドを実行したい。 5 2023/01/24 14:52
- UNIX・Linux マスターブートレコード方式のbiosを使ったシステムでインストールされたlinuxで/dev/sda 1 2023/05/13 21:23
- UNIX・Linux メールアドレスにホスト名が入らないようにする設定 2 2022/06/23 21:06
- Android(アンドロイド) Androidスマホの時刻の自動同期の頻度を短くしたい 4 2022/12/02 17:29
- UNIX・Linux ファイル・フォルダーの削除方法 2 2022/05/19 14:04
- SSL・HTTPS ルート証明書の有効期限がだいぶ前なのに時計が進んでいますと表示され今日になってみれなくなったサイト 1 2022/10/26 20:35
- その他(プログラミング・Web制作) pythonで、tkinterとpillowの組み合わせ 2 2022/08/16 17:42
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FTPでファイルがダウンロードで...
-
ファイルが移動できません。
-
「E212:書込み用にファイルを開...
-
lsでディレクトリのサイズが409...
-
ファイル「所有者」と「所有グ...
-
shellscript内のコマンドを、su...
-
Apacheのドキュメントルート配...
-
シンボリックリンクでパミッシ...
-
Index.html表示しない!!
-
ダウンロードしたファイル
-
ls -lの見方を教えてください。
-
rootユーザのメールボックスへ...
-
Ubuntu、ファイル移動によるエ...
-
Server error! Error 500
-
rootでも権限が無いようです
-
cronで定期的にWGETしたい
-
vsftpで共有ディレクトリ
-
cgi-binディレクトリ内のhtmlを...
-
.htaccess にてドキュメントル...
-
ドキュメントルートのphpファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
FTPでファイルがダウンロードで...
-
lsでディレクトリのサイズが409...
-
ファイルが移動できません。
-
shellscript内のコマンドを、su...
-
Index.html表示しない!!
-
RPM のソースパッケージが展開...
-
PHPでchmod()を使えるようにす...
-
Ubuntu、ファイル移動によるエ...
-
「E212:書込み用にファイルを開...
-
あり得ない!アーカイブを展開...
-
シンボリックリンクでパミッシ...
-
書き込み権限がありません
-
winSCPでlinuxフォルダを作りたい
-
Apacheのドキュメントルート配...
-
rootでも権限が無いようです
-
rootユーザのメールボックスへ...
-
umask757をvar/www/htmlへ適用?
-
vsftpで共有ディレクトリ
-
ダウンロードしたファイル
-
エラー「cpp0: /var/tmp/cczy3N...
おすすめ情報