web-dev-qa-db-ja.com

「Sudo cd / var / named」が機能しないのはなぜですか?

cd/var/namedにしたいのですが、許可拒否エラーが発生します。これを行うためにSudoを使用する場合、許可されません。これの技術的な理由は何ですか?これを他の方法で行うことは可能ですか?

171
Hojat Taheri

これができない理由はシンプルで、2つ折りです

1

cdはプログラムではなく、組み込みコマンドであり、Sudoはプログラムにのみ適用されます。

Sudo fooは、プログラムfooをルートとして実行することを意味します

Sudo cd /pathは戻ります

Sudo: cd: command not found

cdはプログラムではないためです。

2

保護されたディレクトリに対してSudo to cdを使用できた場合、コマンドSudo cd /var/namedを実行すると、通常のユーザーとしてそのディレクトリに移動しますが、通常のユーザーは許可されません。そのディレクトリにある。

これは不可能です。

回避策:

Sudo -iを使用して、自分をスーパーユーザーに昇格させることができます。例えば:

Sudo -i
cd /var/named 

これでルートとしてログオンし、希望するコマンドを使用できます。完了したらexitと入力し、通常のユーザーとしてログオンします。

246
Warren Hill

cdは実行可能ファイルではないため、ディレクトリを変更するためのシェル関数です。

実行する場合:

type cd

あなたの意志:

cdはシェル関数です

Sudo -sを使用して対話型シェルを開き、cdを使用して目的のディレクトリに移動できます。

Sudo -s
cd /var/named

通常のシェルに戻るには、単にヒットします Ctrl+D

28
Basharat Sialvi

上記の答えはすべて正しいです。ここに回避策があります

Sudo sh -c "cd restricted-dir; some_command"
19
Tagar

また、cdのシェル組み込みまたは外部バイナリとしてのステータスにもかかわらず、Sudoは、指定されたコマンドを実行する新しいプロセスを生成することで機能します

何でこれが大切ですか?なぜなら、Sudoの基本的な実行フローは次のようになるからです。

  1. シェルはサブプロセスを生成して、指定されたパラメーターでSudoを実行します
  2. Sudoはユーザーを認証し、指定されたコマンドを実行する権利を確認します
  3. Sudoはサブプロセスを生成して、指定されたコマンドを実行します
  4. Sudoは、ステップ3で生成されたサブプロセスが終了するのを待ちます。
  5. Sudoが終了し、シェルに戻ります
  6. 手順1で発生したサブプロセスが終了し、ユーザーがシェルプロンプトに戻ります

(これは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ディレクトリ階層で開始した場所に戻ります。

16
a CVn

Sudoユーザーの場合、一時的に許可を変更することもできます。

Sudo chmod 0775パス

または

Sudo chmod + r folderpath

必要に応じて元に戻してください。

3
Andres Abello