ルートシェルのネストを防ぐ方法は? (POSIX)

ルートシェルのネストを防ぐ方法は? (POSIX)

次のBashエイリアスを考えてみましょう。すぐに思ったけど、深く掘り下げる時間はなかった。

alias su='sudo -s'

私はBashを実行していますが、いつか共有するためにGitHubに公開できるので、このソリューションを移植可能にしたいと思います。

人々が遭遇する可能性のある問題は、すでにルートされている状態でそのプログラム(このエイリアス)を実行することです。

デモ:

$ su
[sudo] password for vlastimil:                
# su
# su
# 
exit
# 
exit
# 
exit
$ 

ネストされたシェルセッションを防ぐ方法はありますか?

重要:私は別のファイルではなく、ユーザーとルートに同じエイリアスファイルを使用します。ソリューションは移植可能でなければなりません(POSIX)。

ベストアンサー1

suAPI、セマンティクス、動作は異なるコマンドなので、sudo -sコマンドの1つを別のコマンドにエイリアスとして指定しないでください。

ここでは、ログインシェルを起動するコマンドが必要なように見えますが、root権限のないシェルから呼び出されたときにのみ可能なので、次のスクリプトを作成します。rootsudorootshell

#! /bin/sh -

die() {
  printf >&2 '%s\n' "$@"
  exit 1
}

[ "$#" -eq 0 ] || die "Usage: $0

Starts a root shell, no argument accepted."

[ "$(id -u)" -eq 0 ] && die "You're already superuser!"

exec sudo -s

システム構成のデフォルトのターゲットユーザーでない場合は、コマンド(またはシステムのuid 0ユーザー名)-u rootに追加します。sudosudo

または、スクリプトを生成したくない場合は、rootshell() (<that-code>)コードをシェルrcファイルに追加してコードをラップしてシェル関数にします($0すべてのシェルが関数名をに入力するわけではないため、関数名に変更$0)。

おすすめ記事