Нет никакой лучшей практики. Что-либо на основе распознавания переменных ненадежно, и даже хождение по Вашей иерархии процесса требует выводов создания, потому что su выполняет вход в систему без разветвления, не оставляя трассировки, каковы ее аргументы были.
Лучший выбор состоит в том, чтобы протестировать непосредственно на настройки, в которых Вы нуждаетесь. Обычно, то, чем я интересуюсь при поиске оболочек входа в систему, - то, что профиль был считан. Так, если у Вас есть полная свобода изменить Ваш профиль, установите переменную индикатора:
echo "export parsed_profile=true" >> ~/.profile
И затем проверьте это непосредственно. Другая опция состояла бы в том, чтобы проверить владение $HOME:
if /bin/test \! -O "$HOME"; then
echo HOME is not set or set incorrectly.
fi
Или просто непосредственно получите свой профиль из Вашего сценария.
Это может быть, что Ваш вопрос более прост, чем я делаю его; Вы могли бы просто спрашивать, как сказать, вошел ли пользователь в систему как корень или использовал 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
.
Это не было бы категорично, но должно работать большую часть времени
если [$HOME == "/базируются"]...
grep $HOME /etc/passwd
опция выше вида покрытий это более гибким способом... нет?
– David Citron
16 November 2009 в 13:01