Solaris: определите, входит ли оболочка для входа (su -) или нет

Какой лучший способ определить из сценария ksh, является ли текущая оболочка оболочкой входа в систему (su - user) или нет (su user).

Я играю с:

user=$(/usr/xpg4/bin/id -un)
login=$(grep $HOME /etc/passwd | cut -d: -f1 | head -1)
if [ "$login" == "$user" ]; then
    ...
fi

или, возможно, вместо того, чтобы использовать $MAIL переменная на основе комментария на странице руководства su, которая только su - устанавливает MAIL:

user=$(/usr/xpg4/bin/id -un)
login=${MAIL##*/}
if [ "$login" == "$user" ]; then
    ...
fi

но ни один не кажется строго воздухонепроницаемым. Есть ли передовой подход?

5 ответов

case "$0" in
    -*) echo "I'm a login shell";;
esac

Там нет ни одной лучшей практики. Все, что основано на распознавании переменных, ненадежно, и даже обход иерархии процессов требует выполнения выводов, потому что su выполняет вход в систему без разветвления, не оставляя следов своих аргументов.

Лучший выбор - проверить нужные параметры. Обычно при поиске оболочек для входа меня интересует, чтобы профиль был прочитан. Так что, если у вас есть возможность изменить свой профиль, установите переменную индикатора:

echo "export parsed_profile=true" >> ~/.profile

А потом проверьте это напрямую. Другой вариант - подтвердить, что вы являетесь владельцем $HOME:

if /bin/test \! -O "$HOME"; then
    echo HOME is not set or set incorrectly.
fi

Или просто напрямую отправьте свой профиль из скрипта.

В Solaris корневым домашним каталогом по умолчанию является "/", а не "/root". Таким образом, некоторые из предыдущих предложений ненадежны.

Возможно, ваш вопрос проще, чем я его задаю; Вы можете просто спросить, как определить, вошел ли пользователь в систему как root или использовал su, чтобы переключиться на них, и в этом случае будет уместной комбинация ответов, которые я дал.

Как правило, оболочка входа отличается от оболочки, отличной от входа, тем, были ли запущены различные сценарии. Причина, по которой многие пользователи запускают оболочку без входа в систему, заключается в том, что она является частью некоторой программы или (как вы заметили), потому что они используют su переключать пользователей. Эти пользователи будут иметь $LOGNAME не равно $USER

Если, конечно, они не переключатся обратно. Чтобы обнаружить этих пользователей, рассмотрите следующий сценарий perl:

open(P,"ps -ef|");while(<P>){m#^(\S+)\s+(\d+)\s+(\d+)#;$u{$2}=$1;$t{$2}=$3;}
$p=$$;while($t{$p}){$g{$u{$p}}=1;$p=$t{$p};}delete$g{root};$g{$u{$$}}=1;
print keys(%g),"\n";

Если вы хотите ограничить его использование su - ты можешь использовать:

open(P,"ps -ef|");while(<P>){m#^(\S+)\s+(\d+)\s+(\d+).*su - #;$u{$2}=$1;$t{$2}=$3;}
$p=$$;while($t{$p}){$g{$u{$p}}=1;$p=$t{$p};}delete$g{root};$g{$u{$$}}=1;
print keys(%g),"\n";

Если вы действительно хотите видеть оболочки входа, обратите внимание, что оболочки входа запускаются с argv[0] установить с ведущей чертой, так что вы можете использовать:

open(P,"ps -eo user,pid,ppid,comm|");while(<P>){m#^(\S+)\s+(\d+)\s+(\d+) -#;
  $u{$2}=$1;$t{$2}=$3;}
$p=$$;while($t{$p}){$g{$u{$p}}=1;$p=$t{$p};}delete$g{root};$g{$u{$$}}=1;
print keys(%g),"\n";

но вы упустите ситуацию, когда кто-то бежал ksh --login,

Это не будет окончательным, но должно работать большую часть времени

если [$HOME == "/root"] ...

Другие вопросы по тегам