![sudo -iとsudo suの違い[重複]](https://linux33.com/image/3594/sudo%20-i%E3%81%A8sudo%20su%E3%81%AE%E9%81%95%E3%81%84%5B%E9%87%8D%E8%A4%87%5D.png)
sudo -i
これらとそしての違いは何ですかsudo su
?
答え1
マニュアルページの説明に基づいて、以下を想定してくださいsu
。sudo
- ログインシェルを表しているため、これはまたは
sudo -iu <user>
と同じです。su - <user>
su -l <user>
- パラメータを使用しないと、
su
有効なユーザーIDは変更されますが、元の<user>
環境を使用してwho am i
います<user>
。
sudo のマニュアルページから抜粋
-i [command]
The -i (simulate initial login) option runs the shell specified in
the passwd(5) entry of the target user as a login shell. This means
that login-specific resource files such as .profile or .login will
be read by the shell. If a command is specified, it is passed to
the shell for execution. Otherwise, an interactive shell is
executed. sudo attempts to change to that user's home directory
before running the shell. It also initializes the environment,
leaving DISPLAY and TERM unchanged, setting HOME, MAIL, SHELL,
USER, LOGNAME, and PATH, as well as the contents of
/etc/environment on Linux and AIX systems. All other environment
variables are removed.
はい
UID 500を持つユーザーアカウントがありますsaml
。
$ egrep "Uid|Gid" /proc/$$/task/$$/status
Uid: 500 500 500 500
Gid: 501 501 501 501
上記の出力では、最初の列は実際のUID(uid)、2番目の列は有効なUID(euid)です。
(su)経由でルートになる
$ su
今私はルートですが、まだ環境を維持しており、実際のUIDもそのまま残ります500
。私のeuidは現在0(ルート)です。
$ egrep "Uid|Gid" /proc/$(pgrep su -n)/task/$(pgrep su -n)/status
Uid: 500 0 0 0
Gid: 501 501 501 501
しかし、私の環境はまだsaml
同じです。環境変数の1つです$LOGNAME
。
$ env | grep LOGNAME
LOGNAME=saml
(su -)または(sudo -i)を介してルートになります。
$ su -
私の有効なUIDを新しいユーザーに使用または変更するsu -
だけでsudo -i
なく、ログインしたかのようにファイルをインポートし、今や私の環境は直接ログインしたのと同じになります。
$ egrep "Uid|Gid" /proc/$(pgrep su -n)/task/$(pgrep su -n)/status
Uid: 500 0 0 0
Gid: 501 501 501 501
しかし、私の環境は現在ですroot
。これで同じ変数を$LOGNAME
設定するために使用されますroot
。
$ env | grep LOGNAME
LOGNAME=root
では、違いは何ですか?
さて、上記の方法を試してみましょsudo -i
う。
$ sudo -i
それでは、同じ情報を見てみましょう。
$ egrep "Uid|Gid" /proc/$(pgrep su -n)/task/$(pgrep su -n)/status
Uid: 0 0 0 0
Gid: 501 501 501 501
root
しかし、重要なのは、この方法を使用すると、私の有効なIDと実際のIDの両方が0()であることです。環境変数$LOGNAME
はroot
。
$ env | grep LOGNAME
LOGNAME=root
環境比較
この3つの方法で行数を数えると、追加情報が得られます。
$ env > /tmp/<method used to become root>
これで、次の3つのファイルが残りました。
- -rw-r--r-- root root 1 1999年11月2日06:43 sudo_root.txt
- -rw-r--r-- ルート 1個 1970年11月2日 06:44 sudash_root.txt
- -rw-r--r-- 1 root root 4859 11月2日06:44 su_root.txt
私たちはすでにsimple.environmentだけを見ることができますsu
。他のサイズに比べて2倍以上大きいです。
1行あたりの行数:
$ wc -l su*
28 sudash_root.txt
32 sudo_root.txt
92 su_root.txt
実際にファイルをもっと詳しく見る必要はありませんsu_root.txt
。このファイルには、コマンドを実行するためのほとんどのユーザーエクスペリエンスが含まれていますsu
。それでは、残りの2つのファイルを見てみましょう。
いくつかの外観上の変数(例えば、わずかに異なる変数)を除いて、$LANG
実際には同じです。リストで最も恐ろしい証拠は$PATH
。
Sudo
PATH=/usr/lib64/ccache:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/brlcad/bin:/root/bin
数 -
PATH=/usr/lib64/qt-3.3/bin:/usr/lib64/ccache:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/brlcad/bin:/root/bin
ご覧のように、疑わしいパスを削除して追加の保護を提供しますが、GUIを別の場所に表示してもそのままにsudo -i
してください。$DISPLAY
$TERM
テイクアウト?
- 最大の利点は、ルートになる方法は、
sudo -i
自分のパスワードを使用してルートのパスワードを公開する必要がないという点で、他の方法に比べて利点があることです。 - いつになるのかについてのログがありますが
root
、神秘的に誰かがroot
通り過ぎたりsu
になりますsu -
。 sudo -i
あなたとあなたをsu
保護するので、これらのいずれかよりも優れたユーザーエクスペリエンスを提供します。$DISPLAY
$TERM
sudo -i
root
ユーザーが特定の環境を制限することで、システムを一部保護します。
どうですかsudo su
?この問題についてまだ議論していませんか?
OPはこれについて質問したが、IMOという質問を混乱させる可能性があるため、意図的に議論に含めることを避けた。sudo su
このコマンドを実行すると、sudo
コマンドの効果が隠され、su
通常の環境で得られた環境の大部分がsu
失われます。 Sudoはそのタスクを実行し、制限された保護された環境を提供しsudo su
ますsudo -i
。
はい
これは環境がダンプされた結果ですsudo su
。
ls -l /tmp/sudosu_root.txt
-rw-r--r-- 1 root root 1933 Nov 2 14:48 /tmp/sudosu_root.txt
行数は次のとおりです。
$ wc -l /tmp/sudosu_root.txt
31 /tmp/sudosu_root.txt
sudo su -
aとaの間に違いがある唯一の変数は次のとおりですsudo -i
。
$ sdiff /tmp/sudosu_root.txt /tmp/sudo_root.txt | grep ' |'
USERNAME=saml | USERNAME=root
PATH=/usr/lib64/ccache:/sbin:/bin:/usr/sbin:/usr/bin:/usr/brl | PATH=/usr/lib64/ccache:/usr/local/sbin:/sbin:/bin:/usr/sbin:/
MAIL=/var/spool/mail/saml | MAIL=/var/spool/mail/root
PWD=/home/saml/tst | PWD=/root
SUDO_COMMAND=/bin/su | SUDO_COMMAND=/bin/bash
XAUTHORITY=/root/.xauthYFtlL3 | XAUTHORITY=/var/run/gdm/auth-for-saml-iZePuv/datab
ご覧のとおり、それらの間には実際に大きな違いはありません。若干異なる$PATH
、、$SUDO_COMMAND
の違いのみ$MAIL
あります。$USERNAME
引用する
答え2
@slmが質問を誤解しているようで、他の答えを提供してください。
彼はポイントを合わせた。 1つはログインシェルで、もう1つはそうではありません。
実行するとsudo -i
シェルはログインシェルになるので、~/.profile
ログインではなくシェルでは~/.bashrc
。
sudo
su
(例:)と接続するとsudo su
、両方ともログインシェルをsudo
呼び出すことはありません。使用su
時に同等のものはです。sudo -i
su
sudo su -l
私は個人的にsudo su
これが「猫の役に立たない使用」の例に似ていると思います。を使用して同じ動作を得ることができますsudo -s
。
デフォルトでは、sudoを介してルートシェルを呼び出す5つの一般的な方法があります。
sudo su
- 非ログインシェル
HOME
に設定/root
- 剪定環境
sudo -i
- ログインシェル
HOME
に設定/root
- 剪定環境
sudo su -l
- ログインシェル
HOME
に設定/root
- 剪定環境
シェルを呼び出すときは、次のようになります。
sudo -i
sudo -s
- 非ログインシェル
HOME
に設定/root
- 剪定環境
シェルを呼び出すときは、次のようになります。
sudo su
sudo -Es
- 非ログインシェル
HOME
放しておく- 環境に影響なし(
$PATH
iircを除く$LD_LIBRARY_PATH
)
このルールは、シェルを取得するために使用する場合にのみ適用されます。sudo -s somecommand
との間には違いがありますsudo su -c somecommand
。
答え3
2番目のコマンドは現在のディレクトリ(pwd)を保持しますが、1番目のコマンドはユーザーをルートのホームディレクトリに配置します。