
cd
スーパーユーザー権限でコマンドを実行して、root が所有するディレクトリにアクセスする方法はありますか? を実行するとsudo cd <path>
、 が表示されますsudo: cd: command not found
。
答え1
他の答えも間違っていません。
おそらくより良い答えは次のようになります:
sudo ツールはスーパーユーザーとしてアクションを実行することを目的としており、ここでは「ls」や「vi」などのアクションに先行する状態変更のようなものを記述して、アクションを簡素化しています。
たとえば、/root/private/ 内のファイルを編集したい場合は、次のようにすることをお勧めします。
sudo ls /root
sudo ls /root/private
sudoedit /root/private/<name from previous ls command>
これは確かに入力が多く、ディレクトリを変更するだけよりも少し難しいです。しかし、遠い'sudo bash' のバリエーションを実行するよりも、監査しやすく、sudo の背後にある原則にずっと沿っています。
安全な環境で作業している場合は、IAチームに感謝されるでしょう。「先日、どんな変更を行ったのか?」と疑問に思う場合は、あなたどのファイルを編集したのか悩む必要がなくなるので、感謝されるでしょう。
とはいえ、何らかの形式の「sudo bash」を有効にして実行する方が間違いなく簡単です。もっと簡単な方法を探しているのであれば、なぜ最初から root としてログインするのではなく「sudo」を使用するのでしょうか?
答え2
ご指摘のとおり、cd
はシェルの組み込みコマンドであり、理由がある「現在のディレクトリ」はプロセスごとのパラメータであり、プロセスによってのみ変更できます。自体。
シェルの作業ディレクトリは、どの子プロセスでも変更できません。そのため、特権サブシェルで実行できたとしてもcd
、その一時サブシェルの作業ディレクトリのみが変更され、どのような権限昇格方法を使用しても意味がありません。
したがってsudo cd
、sudo が機能するには、sudo 自体がシェルに組み込まれている必要があり、すでに実行中のプロセスの権限を上げる何らかの方法が必要になります。現在、Linux (および他のほとんどのオペレーティング システム) にはそのようなメカニズムは存在しません。
望むことを達成する一つの方法は、相互の作用シェルをルート権限で起動し(どの方法でもかまいません)、cd
その中で通常のシェルを使用します。
[user@host /]$ sudo bash
[root@host /]# cd /root/secret
すべてを 1 つのコマンドで実行したい場合は、次のようにします。まず作業ディレクトリを変更し、次に対話型シェルを起動します。
sudo bash -c "cd /root/secret && bash"
su -c "cd /root/secret && zsh"
注: 外側のコマンドはシェルである必要はなく、何か作業ディレクトリを変更し、新しいコマンドを実行します。最近の Linux システムには、使用できるヘルパーが 1 つまたは 2 つあります。
sudo nsenter --wd="/root/secret" bash # util-linux v2.23 (debian jessie)
sudo env --chdir="/root/secret" bash # coreutils v8.28 (debian buster)
この方法の利点は、ネストされた引用符を必要としないことです。つまり、空白や特殊文字の問題が発生することなく、複数単語のコマンドを実行できます。
最後に、一部のプログラムには、作業ディレクトリを変更するための組み込みオプションがあります。
sudo make -C /etc
sudo git -C /root/secret log