GNU/Linux >> Linux の 問題 >  >> Linux

Linux でスーパーユーザーとして cd コマンドを実行する

ご指摘のとおり、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」を使用しているのですか?


Linux
  1. Linuxでsudoを使用して権限を委任する

  2. Linux での sudo コマンドの例

  3. Linux:特定のディレクトリでコマンドを実行する方法

  1. Podmanでsudoを使用せずにLinuxでコンテナを実行する

  2. Linuxmvコマンド

  3. Linuxduコマンド

  1. Linuxシェルコマンド/スクリプトをバックグラウンドで実行する方法

  2. Linuxipコマンド

  3. Linuxcdコマンド