web-dev-qa-db-ja.com

Sudo suを実行する正当な理由はありますか?

ルートアカウントが無効になっているマシンでルートシェルを起動するには、次のいずれかを実行します。

  • Sudo -i:インタラクティブログインシェルを実行します(/root/.bashrcおよび/root/.profileを読み取ります)
  • Sudo -s:ログイン以外のインタラクティブシェルを実行します(/root/.bashrcを読み取ります)

Ubuntuの世界では、ルートシェルを取得する方法としてSudo suの提案がよく見られます。なぜ2つのコマンドを実行するのに、なぜ実行するのですか?私の知る限り、Sudo -iSudo su -と同等であり、Sudo -sSudo suと同じです。

唯一の違いがあるようです(左側のSudo -iと右側のSudo su -を比較):

screenshot of meld comparing 'Sudo -i' and 'Sudo su -'

そしてSudo -s(左)とSudo su(右)を比較すると:

screenshot of meld comparing 'Sudo -s' and 'Sudo su'

主な違い(Sudo_foo変数とLS_COLORSを無視する)は、XDG_fooバージョンのSudo suシステム変数です。

その違いがかなりエレガントでないSudo suの使用を保証するケースはありますか? (よくあるように)Sudo suを実行しても意味がない、または何か不足していることを安全に説明できますか?

80
terdon

あなたの質問で述べたように、主な違いは環境です。

Sudo su -Sudo -i

Sudo su -の場合、これはログインシェルであるため、/etc/profile.profile、および.bashrcが実行され、ルートの環境のあるルートのホームディレクトリに移動します。

Sudo -iSudo su -とほぼ同じです。-i(初期ログインをシミュレート)オプションは、ターゲットユーザーのパスワードデータベースエントリで指定されたシェルをログインシェルとして実行します。つまり、.profile.bashrc.loginなどのログイン固有のリソースファイルがシェルによって読み取られ、実行されます。

Sudo suSudo -s

Sudo suは、コマンドSudosuを呼び出します。 Bashはインタラクティブな非ログインシェルと呼ばれます。したがって、bash.bashrcのみを実行します。 rootに切り替えた後も、同じディレクトリにいることがわかります。

user@Host:~$ Sudo su
root@Host:/home/user#

Sudo -s$Shell変数を読み取り、コンテンツを実行します。 $Shell/bin/bashが含まれている場合、Sudo /bin/bashが呼び出されます。つまり、/bin/bashは非ログインシェルとして起動されるため、すべてのドットファイルは実行されませんが、bash自体は読み取ります呼び出し元ユーザーの.bashrc。環境は変わりません。あなたの家は根の家にはなりません。つまり、あなたはrootですが、呼び出し元のユーザーの環境にいます。

結論

-iフラグは、_ 2004Sudoに追加され、Sudo su -と同様の機能を提供するため、Sudo su -Sudo -iのテンプレートであり、そのように動作するように。環境が重要でない限り、どちらを使用してもかまいません。

添加

ここで言及しなければならない基本的なポイントは、Sudoがより高い特権で1つのコマンドのみを実行し、それらの特権を元のコマンドにドロップするように設計されていることです。ユーザーを本当にswitchし、ルートシェルを開いたままにすることを意図したものではありません。時間の経過とともに、Sudoはそのようなメカニズムで拡張されました。なぜなら、すべてのコマンドの前でSudoを使用する理由に人々は悩まされていたからです。

したがって、Sudoの意味が悪用されました。 Sudoは、root権限の使用を最小限に抑えるようユーザーに促すことを目的としています。

現在、Sudoの人気が高まっています。よく知られているほぼすべてのLinuxディストリビューションに統合されています。別のユーザーアカウントに切り替える元のツールはsuです。古い学校* nixのベテランの場合、Sudoのようなものは不要に思えるかもしれません。これにより、Microsoftのosファミリでわかっているメカニズムが複雑になり、動作しやすくなるため、* nixシステムの単純さの哲学に反します。

私は本当にベテランではありませんが、私の意見では、Sudoはいつも私の側にとげがありました。導入されたときから、可能であれば、Sudoの使用方法を常に回避していました。 Sudoを使用するのが最も嫌です。私のすべてのシステムで、rootアカウントが有効になっています。しかし、状況は変化します。おそらくsuが廃止され、Sudosuに完全に置き換わる時が来るでしょう。

したがって、Sudoなどの古いツールに依存するのではなく、suの内部メカニズム(-s-i)を使用するのが最善だと思います。

64
chaos

質問に直接回答するには:いいえ、これを行う正当な理由はありません。また、Sudo suは、1つで十分な場合に2つのログエントリを生成します。

多くの人がこれを行っているのを見てきました。なぜSudo -sを実行しないのかと尋ねると、答えは、Sudoへの-sフラグについて知らないということです。指摘したら切り替えます。

ただし、Sudo -sSudo -iのリストに、Sudo -sEの代わりとなるオプションsu -mをもう1つ追加したいと思います。 Sudo -sEは、ホームディレクトリを含む環境を保持します。ホームディレクトリが安全でない場合(NFS上)、これにはリスクがあります。しかし、多くの人がルートを使用する環境では、ルート.bashrcファイルの内容に同意する必要がなくなります。私の.bashrcにはrootの多くの特殊化が含まれているため、rootとまったく同じ環境を取得することはできませんが、少なくとも希望する環境を取得できます。

17
user3188445