如果当前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”] …