Solaris:确定是否loginshell(su – )或不

如果当前shell是一个loginshell( su - user )或不是( su user ),从ksh脚本中确定最好的方法是什么。

我正在玩弄:

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

或者可能改为使用$MAILvariables根据su - man页面中的一个注释,这个注释只能设置MAIL:

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

但似乎都不严格密切。 有最佳实践方法吗?

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

没有最好的做法。 基于variables识别的任何事情都是不可靠的,甚至在你的stream程层次结构中需要进行推理,因为su执行login而没有分叉,不会跟踪它的参数。

更好的select是直接testing你需要的设置。 通常,我在寻找loginshell时感兴趣的是configuration文件被读取。 所以,如果你有自由的统治来修改你的个人资料,请设置一个指标variables:

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

然后直接检查。 另一个select是validation你拥有你的$ HOME:

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

或者直接从您的脚本中直接获取您的configuration文件。

这可能是,你的问题比我做得更简单。 你可能会简单地问如何判断用户是以root身份login还是使用su来切换到他们,在这种情况下,我给出的答案是合适的。

通常情况下,通过各种脚本是否运行,loginshell与非loginshell是有区别的。 许多用户启动非loginshell的原因是因为它是某个程序的子shell,或者(因为他们使用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"; 

如果你想真正看到loginshell,注意loginshell是以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”。 以前的一些build议是不可靠的。

这不是确定的,但应该在大多数时间工作

如果[$ HOME ==“/ root”] …