ご指摘のとおり、cd
シェル組み込みコマンドであり、理由があります そのために:「現在のディレクトリ」はプロセスごとのパラメーターであり、プロセスによってのみ変更できます それ自体 .
シェルの作業ディレクトリは、どの子プロセスからも変更できません。そのため、たとえ cd
を実行できたとしても 特権サブシェルでは、その一時サブシェルの作業ディレクトリのみが変更され、使用する特権を上げる方法は関係ありません.
sudo cd
の場合 機能するには、sudo自体がシェルに組み込まれている必要があり、すでに実行中のプロセスの特権を上げる何らかの方法が必要です。現在、Linux (他のほとんどのオペレーティング システムも同様) にはそのようなメカニズムはありません。
あなたが望むものを達成する1つの方法は、インタラクティブを実行することです root 権限を持つシェル (どの方法でも動作します) で、通常の cd
を使用するだけです その中:
[[email protected] /]$ sudo bash
[[email protected] /]# 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
他の答えは間違っていません。
おそらくより良い答えは次のとおりです:
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」を使用しているのですか?