Linuxターミナルでのルートセッションにアクセスするためのさまざまな方法があります。これは混乱を引き起こす可能性があり、ルート権限を得ようとする初心者の多くは、各コマンドがどのようにルートアクセスを取得できるか、どのように異なるか、これらの違いがいつ重要であるかを理解していないかもしれません。ここでは、ターミナルでルートアクセスを得るために使用されるさまざまなコマンドを詳しく説明し、どのようにルートを取得し、いつ使用するか、その他のポイントを説明します。
目次
- su
- su -c
- sudo su
- sudo -i
- sudo -s
- よくある質問
またお読みください: Doasとは何か、そしてそれをインストールする方法
su
suコマンドは、現在のシェルで現在のユーザーをルートに置き換えます。
suの後にユーザー名を追加することで、任意のユーザーに切り替えることができます。
これにより、システムは現在のユーザーを指定されたユーザーに切り替え(実質的にログアウト)します。あるいは、suコマンドの後に何も指定せずにsuを入力することで、ルートアクセスを得ることができます。
suは、ユーザーがシステム上のルートアカウントに直接アクセスしたい場合に最適です。sudoなどを経由せず、ルートユーザーのパスワードを入力することが求められます。これは、文字通りそれにログインしているからです。さらに、他のルートアクセス方法は、ルートのホームディレクトリやルート環境にもアクセスできるという利点がありません。
警告: suの使用は、ルートアクションを実行する最も安全でない方法です。一般的には、可能であればこれを避けるべきです。
またお読みください: AptおよびApt-Getコマンドの究極のガイド
su -c
このコマンドは、他のコマンドをルートユーザーに直接渡します。
sudoの前にコマンドを入力するように、su -cはルートユーザーとしてコマンドを実行します。ただし、単にコマンドを入力するのではなく、引用符内にそれを入れる必要があります。
これは、端末を通じて昇格した特権でコマンドをすばやく実行する方法です。sudoが利用できない場合(例:Arch Linuxのようなディストリビューションでは事前にインストールされていない)や不正に動作する場合に非常に便利です。
何かをルートに直接渡すため、ユーザーとルートのパスワードが異なる場合は、認証のためにルートのパスワードを入力する必要があります。
sudo su
このコマンドは、ルートの代わりに現在のユーザーのパスワードを求めます。
これは本質的に、シェルでsuを実行するのと同じですが、1つの重要な違いがあります:システムに「ユーザーを切り替え」直接指示するのではなく、スーパーユーザー特権でsuコマンドを実行させることです。sudo suが実行されると、「.profile」、「.bashrc」、「/etc/profile」が開始され、su(またはsu root)を実行するときのようになります。sudoの前にコマンドを実行する場合、そのコマンドにはルートの特権が与えられます。
sudo suとsuの間には大きな違いはありませんが、前者は依然として非常に便利なコマンドです。なぜなら、ユーザーがシステムでルートアクセスを得るためにsuを実行する場合、ルートのパスワードを知っている必要があるからです。sudo suを使用すると、現在のユーザーのパスワードを要求することでルートが与えられ、ルートのパスワードなしでルートを取得することが可能です。
これは、ルートパスワードを忘れてしまった場合に便利です。他のユーザーアカウントのパスワードとは異なる場合です。この間にこれを実行することはできますが、いずれはルートパスワードをリセットするべきです。
またお読みください: Linuxでのrmコマンドの使い方
sudo -i
sudo -iを使用することは、sudo suコマンドとほぼ同じですが、1つの例外があります:ルートユーザーと直接対話しません。
sudo suと同様に、-iフラグを使用すると、ユーザーはルートアカウントのパスワードを知らなくてもルート環境を取得できます。sudo -iは、sudo suを使用するのと非常に似ています:すべての環境ファイル(「.profile」など)を読み込み、シェル内に環境を設定します。
sudo suと異なる点は、sudo -iがルートユーザーと直接対話することなく、ルートおよびルート環境をきれいに取得する方法であるということです。
整理すると:sudo suを使用すると、バックグラウンドで複数のルートsetuidコマンドの使用しています。これにより、どの環境変数が保持され、どの環境変数が変更されるかを特定することが難しくなります(ルート環境に切り替えるとき)。これはsudo -iでは当てはまりません。したがって、ほとんどの人は、直接ログインせずにルートを取得するために好ましい方法と見なしています。
簡単に言うと:sudo -iは、ルートユーザーの「ホーム」フォルダーである「/root」に「クリーンな」ルートログインを提供します。
またお読みください: Linuxでのddコマンドの使い方
sudo -s
このコマンドは、あなたの$SHELL変数でシェルを起動します。
sudoコマンドの-sスイッチは、コマンドを実行している現在のユーザーの$SHELL変数を読み込みます。このコマンドは、ユーザーがbashを使用している場合、sudo /bin/bashを実行しているかのように機能します。
私たちの場合、sudo -sは、前にfishをデフォルトシェルとしてインストールしたため、sudo /usr/bin/fishを実行したかのようにfishの対話型シェルを提供しました。
sudo -sは「非ログイン」スタイルのシェルです。sudo -iやsudo suのようなコマンドとは異なり、システムは環境ファイルを読み込みません。ユーザーがシェルにsudo -sを実行するよう指示すると、ルートを取得しますが、ユーザー環境は変更されません。ホームはルートのホームにならず、など。
このコマンドは、ユーザーがルートに切り替えたいが同じシェル環境を維持したい場合に最適です。たとえば、fishスクリプトを実行したい場合、ほとんどのディストリビューションでルートがしばしば得るデフォルトのbashシェルに強制されることなく実行できます。
上記で説明された他のコマンドはルートアクセスを得ますが、ルート用にディストリビューションが持つシェルと環境変数も提供します。すべてを持たずにユーザーに切り替えたいだけかもしれません!
またお読みください: Linux初心者のための基本的なBashコマンド
よくある質問
実行しているシェルが重要な理由は?
ユーザーアカウントに修正されていないbashシェルを使用している場合、違いは主に哲学的です。ほとんどの場合、どちらのシェルを通じてもルートに昇格することは目立った変化をもたらしません。しかし、他のシェルを使用している場合、違いがすぐに感じられるでしょう!
たとえば、ユーザーアカウントにfishシェルを使用し、ルートシェルでbashを保持しているとします。sudo -sを使用してユーザーシェルを読み込むと、かなり異なる結果が得られます。
そのシェルは、ルートのホームフォルダーにある設定を従います。そのようなものがない場合は、あなたの個人用のものではなく、デフォルトの構成が読み込まれます。(私たちの場合、それは「~/.config/fish/config.fish」です)。意図的には、ユーザー構成を「/root」にコピーするよりも、そのままにしておく方が良いです。
ルートに切り替える際に、ユーザーアカウントのシェルに変更するのは、その特定のシェルが絶対に必要なスクリプトを実行する必要がある場合のみ行うべきです。
ルートにアクセスするとシステムに害を及ぼすことはありますか?
場合によっては、はい。特定のターミナルセッションでルートにアクセスする必要があることが絶対に確信できない限り、そのコマンドのためにルートにアクセスするには、単にsudoの後にコマンドを入力する方がよいことがよくあります。たとえば、DebianベースのLinuxの任意のバージョンでsudo apt install vlcと入力すると、オペレーティングシステムはVLCをインストールするためにAPTパッケージマネージャーを実行するためだけにルートにアクセスするよう指示します。
sudo -iや以前に説明した他のバリアントを使用してコマンドを実行することについての非常に重要な注意点は、前者は「/var/log/auth.log」にコマンド履歴を記録しないということです。もし何かを間違えた場合、何をしたのかを振り返って修正することができなくなります。記憶を頼りにする必要があり、ルートセッションは記録されません。
コマンドの前に「sudo」を入力すると、私はどの「sudo su」のバリアントを実行していますか?
コマンドを実行するためにsudoを入力すること(すなわち、実行したいコマンドと同じ行に入力している場合)、基本的には、インタラクティブなルートシェルでそれを実行していることになります。これはsudo -s単独コマンドを実行することに相当します。また、su -cコマンドを実行する場合にも非常に似ています。
すべてのスクリーンショットはミゲル・レイバ・ゴメスによるものです。