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 ответов
Там нет ни одной лучшей практики. Все, что основано на распознавании переменных, ненадежно, и даже обход иерархии процессов требует выполнения выводов, потому что 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"] ...