Солярис: определите если оболочка входа в систему (su-) или нет

Конвенция для программ состоит в том, чтобы принять a --prefix флаг к ./configure, например.

./configure --prefix=/home/user/apps/kde
make
make install

Не может сказать, что я попробовал это KDE, хотя, не знайте его процесс сборки.

0
задан 1 September 2012 в 21:57
5 ответов
case "$0" in
    -*) echo "I'm a login shell";;
esac
1
ответ дан 23 November 2019 в 13:24
  • 1
    Мило! Единственная проблема состоит в том, что 0$ будут названием сценария в сценарии. Существует ли способ исследовать флаги оболочки, возможно? –  David Citron 16 November 2009 в 12:53
  • 2
    Цитрон @David: сценарий никогда не будет самой оболочкой входа в систему, таким образом, it' s не собирающийся мочь провериться - это должно было бы проверить своего родителя (или parent' s родитель, и т.д.), и I' m не уверенный, как это сделало бы это. –  Teddy 17 November 2009 в 12:49

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

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

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

И затем проверьте это непосредственно. Другая опция состояла бы в том, чтобы проверить владение $HOME:

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

Или просто непосредственно получите свой профиль из Вашего сценария.

1
ответ дан 23 November 2019 в 13:24

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

Обычно, оболочка входа в систему дифференцируется от non-login-shell тем, были ли запущены различные скрипты. Причина многие пользователи запускают non-login-shell, состоит в том, потому что это - подоболочка некоторой программы, или (как Вы отмечаете), потому что они используют su переключить пользователей. Те пользователи будут иметь $LOGNAME не равняются $USER

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

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.

0
ответ дан 23 November 2019 в 13:24

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

если [$HOME == "/базируются"]...

-1
ответ дан 23 November 2019 в 13:24
  • 1
    Ну, мой grep $HOME /etc/passwd опция выше вида покрытий это более гибким способом... нет? –  David Citron 16 November 2009 в 13:01

На Солярисе корневой корневой каталог '/' по умолчанию, не '/root'. Некоторые предыдущие предложения таким образом ненадежны.

0
ответ дан 23 November 2019 в 13:24

Теги

Похожие вопросы