cd
を/var/named
にしたいのですが、許可拒否エラーが発生します。これを行うためにSudo
を使用する場合、許可されません。これの技術的な理由は何ですか?これを他の方法で行うことは可能ですか?
これができない理由はシンプルで、2つ折りです
cd
はプログラムではなく、組み込みコマンドであり、Sudo
はプログラムにのみ適用されます。
Sudo foo
は、プログラムfooをルートとして実行することを意味します
Sudo cd /path
は戻ります
Sudo: cd: command not found
cd
はプログラムではないためです。
保護されたディレクトリに対してSudo to cd
を使用できた場合、コマンドSudo cd /var/named
を実行すると、通常のユーザーとしてそのディレクトリに移動しますが、通常のユーザーは許可されません。そのディレクトリにある。
これは不可能です。
回避策:
Sudo -i
を使用して、自分をスーパーユーザーに昇格させることができます。例えば:
Sudo -i
cd /var/named
これでルートとしてログオンし、希望するコマンドを使用できます。完了したらexit
と入力し、通常のユーザーとしてログオンします。
cd
は実行可能ファイルではないため、ディレクトリを変更するためのシェル関数です。
実行する場合:
type cd
あなたの意志:
cdはシェル関数です
Sudo -s
を使用して対話型シェルを開き、cd
を使用して目的のディレクトリに移動できます。
Sudo -s
cd /var/named
通常のシェルに戻るには、単にヒットします Ctrl+D。
上記の答えはすべて正しいです。ここに回避策があります
Sudo sh -c "cd restricted-dir; some_command"
また、cd
のシェル組み込みまたは外部バイナリとしてのステータスにもかかわらず、Sudoは、指定されたコマンドを実行する新しいプロセスを生成することで機能します。
何でこれが大切ですか?なぜなら、Sudoの基本的な実行フローは次のようになるからです。
(これはmay be technicicallyわずかに不正確です。実際にはreplaces実行中のプロセスを新しいプロセスと置き換えるシステムコールがあります(Cライブラリのexecve()
)。ただし、この説明の目的上、この2つは同等です。)
これは、現在の作業ディレクトリが各プロセスのプロパティであり、継承されているが昇格されていないであると考える場合に重要になります。したがって、プロセスAが新しいプロセスBから生成される場合、プロセスBはプロセスAが入っていたのと同じ作業ディレクトリから開始されます(これが、ls ./
のようなありふれたことが期待どおりのことをする理由です) Bはits作業ディレクトリを変更しますが、プロセスAがそれを探して外に出ない限り、Aはその変更を完全に認識しません。 (これが、find /
のようなものを実行して途中で中止した場合、findがその場所を見ていたからといって、ファイルシステム内のランダムに見える場所に行かない理由です。中止された瞬間)
したがって、Sudo cd /somewhere
がブリキに書かれていることを正確に実行したとしても、Sudo
が終了するまでに、開始した場所に戻ります。したがって、ユーザーの観点から効果的に、それはノーオペレーションになります。 cd
が実行中にchdir()
システムライブラリ関数を呼び出して新しい作業ディレクトリを設定するという事実は、ユーザーの助けにはなりません。
Warren Hill が指摘したように、適切な解決策(実際には回避策とは呼びません)は、Sudo -i
を使用して、ファイルシステムを自由にナビゲートし、好きなコマンドを実行できるルートシェル。ただし、このシェルを終了すると、上で説明したのとまったく同じ理由でstillディレクトリ階層で開始した場所に戻ります。
Sudoユーザーの場合、一時的に許可を変更することもできます。
Sudo chmod 0775パス
または
Sudo chmod + r folderpath
必要に応じて元に戻してください。