
私は2年間Linuxを使ってきましたが、今日はとても奇妙なことに出会いました。サーバーにnginxをデプロイしましたが、これは対応するログフォルダです。
♪ log l -d nginx drwx------ 2 nginx nginx 4.0K Dec 7 03:15 nginx
(私はzshを使用しています。これは♪ log
「log」というフォルダにあることを意味します。ご覧のように、「nginx」というフォルダにはないと思います。)
アクセスしようとすると、次のようになります。
♪ log cd nginx cd: permission denied: nginx ♪ log sudo cd nginx ♪ log
アクセス許可を766に変更した後でも、フォルダにはまだアクセスできません。
♪ log sudo chmod -R 766 nginx ♪ log l -d nginx drwxrw-rw- 2 nginx nginx 4.0K Dec 7 03:15 nginx ♪ log cd nginx cd: permission denied: nginx ♪ log sudo cd nginx ♪ log
誰でも私にこれを説明できますか?
答え1
主な理由は、sudo cd nginx
nginxフォルダに入って終了したからです。したがって、コマンドを開始する前の状態に戻りますsudo
。
これは例と同じで、sudo ls nginx/*
内容を一覧表示して終了しますnginx folder
。
sudo
要求された権限で新しいプロセスを作成し、要求されたコマンドを実行します。コマンドが完了するとsudoが終了し、前の状況に戻ります。
これを理解するには、ファイルシステム内の場所が使用中のシェルプログラムによって動的に管理されることを理解する必要があります。プロセスが分岐すると、シェルコンテキストが新しいプロセスにコピーされます。コピーコンテキストに対する各操作はそのコンテキストにのみ適用され、親コンテキストには影響しません。したがって、私たちの場合、修正されるのは親cd nginx
プロセスのプロセスではなく、新しいプロセスのプロセスです。$PWD
完了すると、関連コンテキストが削除され、変更されていない親コンテキストに戻ります。
他の人が説明したように、フォルダに移動するには実行権限(+x)も必要です。
答え2
ユーザーはディレクトリを変更するには、ディレクトリに対する実行権限が必要です。
たとえば、質問を参照してください。cdでディレクトリに入ります」。
ルートではなく一般ユーザーとしてnginx
このディレクトリに変更するには、まずこのシェルセッションを使用してルートシェルを起動してアクセスするsudo chmod o+x nginx
こともできます。sudo -s
sudo cd nginx
あまり意味がありません。成功したがプロセスが終了するcd
とsudo
、そのプロセスは実行されたディレクトリに残りますsudo
。現在の作業ディレクトリはプロセス環境の一部であり、子プロセス(sudo
)は親プロセス(対話型シェル)の環境を変更できません。