sudo -iとsudo suの違い[重複]

sudo -iとsudo suの違い[重複]

sudo -iこれらとそしての違いは何ですかsudo su

答え1

マニュアルページの説明に基づいて、以下を想定してくださいsusudo

  1. ログインシェルを表しているため、これはまたはsudo -iu <user>と同じです。su - <user>su -l <user>
  2. パラメータを使用しないと、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()であることです。環境変数$LOGNAMEroot

$ 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

テイクアウト?

  1. 最大の利点は、ルートになる方法は、sudo -i自分のパスワードを使用してルートのパスワードを公開する必要がないという点で、他の方法に比べて利点があることです。
  2. いつになるのかについてのログがありますがroot、神秘的に誰かがroot通り過ぎたりsuになりますsu -
  3. sudo -iあなたとあなたをsu保護するので、これらのいずれかよりも優れたユーザーエクスペリエンスを提供します。$DISPLAY$TERM
  4. sudo -irootユーザーが特定の環境を制限することで、システムを一部保護します。

どうですか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

sudosu(例:)と接続するとsudo su、両方ともログインシェルをsudo呼び出すことはありません。使用su時に同等のものはです。sudo -isusudo 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放しておく
    • 環境に影響なし($PATHiircを除く$LD_LIBRARY_PATH

このルールは、シェルを取得するために使用する場合にのみ適用されます。sudo -s somecommandとの間には違いがありますsudo su -c somecommand

答え3

2番目のコマンドは現在のディレクトリ(pwd)を保持しますが、1番目のコマンドはユーザーをルートのホームディレクトリに配置します。

関連情報