1. 概要

Unixの最初のバージョンがリリースされたとき、それが持っていた最も重要な機能の1つは、ユーザーが1台のコンピューターを共有できるようにするマルチユーザーサポートでした。 このようなシステムの管理には、ユーザー切り替えツールが必要でした。

このチュートリアルでは、 su と、引数の考えられる影響について学習します。

2. Linuxユーザー環境

Linuxで新しい端末が起動すると、オペレーティングシステムは新しいシェルセッションを作成します。 特に指定がない限り、ほとんどすべてのディストリビューションでデフォルトでBashが使用されます。

シェルが起動すると、シェルはそれ自体の環境を準備します。 この環境は、一部のコマンドが機能するために必要な基本情報を保持する小さなキー値ストレージのように機能します。

たとえば、Linuxベースのシステムの pwd コマンドは、PWD環境変数から現在の作業ディレクトリを読み取ります。 cd – コマンドは、最後にアクセスしたディレクトリを見つけるために OLDPWD 変数を必要とします。シェルでコマンドを実行すると、そのコマンドに関する履歴がファイルに書き込まれますパスHISTFILE。環境変数は、バックグラウンドで多くの情報を管理します。

シェルは、特定のスクリプトを呼び出すことによって環境変数を作成します。 すべてのシェルが同じ環境変数を持っているわけではありません。異なるシェルタイプは、異なるスクリプトまたは異なる順序の同じスクリプトを呼び出す可能性があります。

~# env
TERM=xterm-256color
HISTFILE=/home/test/history
PWD=/home/test
OLDPWD=/home/test

3. su

su は、Linuxのコアユーティリティの1つです。 ユーザーが別のユーザーとしてコマンドを実行できるようにします。

su の最も一般的な使用法は、スーパーユーザー特権を取得することです。 「スーパーユーザー」の略語と間違われることが多いですが、「代替ユーザー」の略語です。

su を使用する場合、引数の有無にかかわらず実行できます。 この引数は、 su にログインシェルを呼び出すように指示します。ログインシェルは、すべての環境変数をリセットして、それらを再作成します。 このオプションを省略すると、既存の環境変数のほとんどすべてが同じままになります。 この単一の文字は、ユーザーを変更した後に実行されるコマンドに多くの影響を及ぼします。

3.1. フォルダの違い

su – を使用すると、コマンドによって現在の作業ディレクトリがターゲットユーザーのホームディレクトリに変更されます。 一方、 su コマンドはディレクトリを変更せず、ユーザーを切り替えた後も同じディレクトリに留まります。

test@server:~$ pwd 
/home/test 
test@server:~$ su - 
Password: 
root@server:~# pwd 
/root 
root@server:~# logout 
test@server:~$ su 
Password: 
root@server:/home/test# pwd 
/home/test 

3.2. パスとコマンドの違い

すべてのユーザーは、環境内にパスを持っています。

たとえば、 ls は通常、 / usr / bin /lsにあります。 ただし、フルパスを入力せずに呼び出すことができます。 これが可能なのは、 / usr / bin / がすでにパスにあるため、この場所からのコマンドを直接呼び出すことができるためです。

su – はパスをターゲットユーザーのパスに変更しますが、suは変更しません。 fdiskコマンドを使ってみましょう。

test@server:~$ fdisk 
bash: fdisk: command not found 
test@server:~$ env | grep PATH 
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games 
test@server:~$ su - 
Password: 
root@server:~# fdisk --version 
fdisk from util-linux 2.33.1 
root@server:~# env | grep PATH 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
root@server:~# logout 
test@server:~$ su 
Password: 
root@server:/home/test# fdisk 
bash: fdisk: command not found 
root@server:/home/test# env | grep PATH 
PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games 

ここで注意すべき重要なことは、ユーザーごとにパスに異なるコマンドを含めることができるということです。 たとえば、Debianでは、 fdisk はrootユーザーのパスに存在しますが、他のユーザーのパスには存在しません。 これは、 su –、を呼び出さずに fdisk を使用できないことを意味するのではなく、フルパスで呼び出したことを意味します。

環境変数も、さまざまな方法で一部のコマンドに影響を与えます。 ほとんどのシェルは、履歴ファイルに書き込んだコマンドをログに記録します。 シェルは、 HISTFILE=変数からこのファイルの場所を読み取ります。

–引数なしで su を使用すると、古いユーザーの履歴に新しいコマンドが書き込まれます。 引数を使用すると、新しいコマンドがターゲットユーザーの履歴に保存されます。

3.3. ウィンドウシステムの違い

一部のコマンドには、グラフィカルユーザーインターフェイスが付属しています。 このようなコマンドは、環境変数から使用する表示を読み取ります。 su – を使用すると、環境変数がリセットされます。 現在の表示でグラフィカルアプリケーションを開始するには、-を使用せずに環境変数を保持する必要があります。

test@server:~# su - 
Password: 
root@server:~# gparted 
(gpartedbin:4118): Gtk-WARNING **: 14:50:36.017: cannot open display: 
root@server:~# logout 
test@server:~# su 
Password: 
root@server:/home/test# gparted 
bash: gparted: command not found 
root@server:/home/test# /usr/sbin/gparted 
====================== 
libparted : 3.2 
======================

ご了承ください、 gparted 既存の環境のパスにコマンドがないため、バイナリの絶対パスを指定しました。

4. 概要

この記事では、Linuxのsuコマンドとsu–コマンドの主な違いについて説明しました。

パスの違い、直接使用できるコマンド、履歴ファイル、およびグラフィックの違いを確認しました。