Назад | Перейти на главную страницу

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 man page только это su - устанавливает ПОЧТУ:

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

но ни то, ни другое не кажется полностью герметичным. Есть ли лучший практический подход?

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

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

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

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

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

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

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

Возможно, ваш вопрос проще, чем я его задаю; вы могли бы просто спросить, как узнать, вошли в систему как 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.

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

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

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