当前位置: 技术问答>linux和unix
郁闷:关于Solaris上su的n多疑惑
来源: 互联网 发布时间:2015-08-02
本文导语: 一般来说,su命令有两种用法 su 用户名(默认root) 切换到新用户的权限,同时保持本用户的环境变量 su - 用户名(默认root) 相当于用新用户登陆了一次 以下是我在Solaris 9上测试的结果: (注:su表示Solaris自带的su命...
一般来说,su命令有两种用法
su 用户名(默认root) 切换到新用户的权限,同时保持本用户的环境变量
su - 用户名(默认root) 相当于用新用户登陆了一次
以下是我在Solaris 9上测试的结果:
(注:su表示Solaris自带的su命令,su.bak表示GNU su)
1、普通用户的环境变量
david@billdavid>env
_=/usr/local/bin/env
LANG=zh_CN.GB18030
HZ=100
PATH=/usr/local/tinyq/bin:/usr/local/bin:/usr/ccs/bin:/usr/bin:
LOGNAME=david
MAIL=/var/mail/david
HOSTNAME=billdavid
PS1=$PWD
$LOGNAME@$HOSTNAME>
SHELL=/bin/ksh
HOME=/export/home/david
LD_LIBRARY_PATH=/usr/local/tinyq/lib::/usr/local/lib
TERM=vt100
QTDIR=/usr/local/tinyq
PWD=/export/home/david
TZ=PRC
MQCONFIGFILE=/export/home/david/config/msq.cfg
2、用su切换到root用户
david@billdavid>su
Password:
此时的环境变量
# env
HOME=/export/home/david ---------> 未变
HOSTNAME=billdavid
HZ=100
LANG=zh_CN.GB18030
LOGNAME=david
MAIL=/var/mail/david
MQCONFIGFILE=/export/home/david/config/msq.cfg
PATH=/usr/sbin:/usr/bin ---------->有问题
PS1=#
PWD=/export/home/david
QTDIR=/usr/local/tinyq
SHELL=/bin/ksh --------->未变
TERM=vt100
TZ=PRC
_=/usr/local/bin/su
但PATH发生了变化,变成了默认初始值,而且少了一个LD_LIBRARY_PATH,这说明Solaris自带的su并不满足上面的规则。而且试验发现环境PWD在切换到root后会一直保持切换前的值,不会随目录变换。
3、用su -切换到root用户,一切OK
david@billdavid>su -
Password:
Sun Microsystems Inc. SunOS 5.9 Generic_112234-03 November 2002
# env
HOME=/
HZ=100
LD_LIBRARY_PATH=/usr/local/tinyq/lib::/usr/local/lib ------>OK
LOGNAME=root
PATH=/usr/local/tinyq/bin:/usr/local/bin:/usr/ccs/bin:/usr/sbin:/usr/bin ------->该PATH信息是在/etc/profile中设置的,在这里生效了,说明所有用户登陆Solaris时均执行了/etc/profile,但su切换时仅进行权限的切换,不执行该profile文件,但怎么会丢环境变量呢?
QTDIR=/usr/local/tinyq
SHELL=/sbin/sh
TERM=vt100
TZ=PRC
4、用GNU的su切换到root用户,保持了原来用户的环境变量。但是遇到了些更麻烦的问题。
david@billdavid>su.bak
Password:
$PWD
$LOGNAME@$HOSTNAME>env
HOME=/
HOSTNAME=billdavid
HZ=100
LANG=zh_CN.GB18030
LD_LIBRARY_PATH=/usr/local/tinyq/lib::/usr/local/lib
LOGNAME=david
MAIL=/var/mail/david
MQCONFIGFILE=/export/home/david/config/msq.cfg
PATH=/usr/local/tinyq/bin:/usr/local/bin:/usr/ccs/bin:/usr/bin:
PS1=$PWD
$LOGNAME@$HOSTNAME> -------->这个问题很麻烦,下面详细说明
PWD=/export/home/david
QTDIR=/usr/local/tinyq
SHELL=/sbin/sh
TERM=vt100
TZ=PRC
_=/usr/local/bin/su.bak
在用户david的.profile文件中,我添加了如下内容,以将PS1更改为自己所希望的内容:
HOSTNAME=`hostname`
PS1='$PWD
$LOGNAME@$HOSTNAME>'
export HOSTNAME PS1
当用su.bak进行切换时,继承了上述环境变量,但由于使用的时单引号,不进行$的解析,从而出现了上述问题,提示符始终不变,但是为什么普通变量时可以让PS1随目录变化呢?
5、用GNU的su -切换到root用户,没有什么问题,执行了/etc/profile,但是在执行/etc/profile之前的还会执行其它的脚本吗?之后呢?希望有,这样我就可以在其中添加一些自己的东西了。
david@billdavid>su.bak -
Password:
Sun Microsystems Inc. SunOS 5.9 Generic_112234-03 November 2002
# env
HOME=/
LD_LIBRARY_PATH=/usr/local/tinyq/lib::/usr/local/lib
LOGNAME=root
PATH=/usr/local/tinyq/bin:/usr/local/bin:/usr/ccs/bin:/usr/ucb:/bin:/usr/bin:/etc
QTDIR=/usr/local/tinyq
SHELL=/sbin/sh
TERM=vt100
USER=root
#
此外,Solaris的sh好像也有点问题,好像不支持alias,root使用/sbin/sh时好像也不支持PWD环境变量,以至于在进行程序编译时总是出现目录错误。
su 用户名(默认root) 切换到新用户的权限,同时保持本用户的环境变量
su - 用户名(默认root) 相当于用新用户登陆了一次
以下是我在Solaris 9上测试的结果:
(注:su表示Solaris自带的su命令,su.bak表示GNU su)
1、普通用户的环境变量
david@billdavid>env
_=/usr/local/bin/env
LANG=zh_CN.GB18030
HZ=100
PATH=/usr/local/tinyq/bin:/usr/local/bin:/usr/ccs/bin:/usr/bin:
LOGNAME=david
MAIL=/var/mail/david
HOSTNAME=billdavid
PS1=$PWD
$LOGNAME@$HOSTNAME>
SHELL=/bin/ksh
HOME=/export/home/david
LD_LIBRARY_PATH=/usr/local/tinyq/lib::/usr/local/lib
TERM=vt100
QTDIR=/usr/local/tinyq
PWD=/export/home/david
TZ=PRC
MQCONFIGFILE=/export/home/david/config/msq.cfg
2、用su切换到root用户
david@billdavid>su
Password:
此时的环境变量
# env
HOME=/export/home/david ---------> 未变
HOSTNAME=billdavid
HZ=100
LANG=zh_CN.GB18030
LOGNAME=david
MAIL=/var/mail/david
MQCONFIGFILE=/export/home/david/config/msq.cfg
PATH=/usr/sbin:/usr/bin ---------->有问题
PS1=#
PWD=/export/home/david
QTDIR=/usr/local/tinyq
SHELL=/bin/ksh --------->未变
TERM=vt100
TZ=PRC
_=/usr/local/bin/su
但PATH发生了变化,变成了默认初始值,而且少了一个LD_LIBRARY_PATH,这说明Solaris自带的su并不满足上面的规则。而且试验发现环境PWD在切换到root后会一直保持切换前的值,不会随目录变换。
3、用su -切换到root用户,一切OK
david@billdavid>su -
Password:
Sun Microsystems Inc. SunOS 5.9 Generic_112234-03 November 2002
# env
HOME=/
HZ=100
LD_LIBRARY_PATH=/usr/local/tinyq/lib::/usr/local/lib ------>OK
LOGNAME=root
PATH=/usr/local/tinyq/bin:/usr/local/bin:/usr/ccs/bin:/usr/sbin:/usr/bin ------->该PATH信息是在/etc/profile中设置的,在这里生效了,说明所有用户登陆Solaris时均执行了/etc/profile,但su切换时仅进行权限的切换,不执行该profile文件,但怎么会丢环境变量呢?
QTDIR=/usr/local/tinyq
SHELL=/sbin/sh
TERM=vt100
TZ=PRC
4、用GNU的su切换到root用户,保持了原来用户的环境变量。但是遇到了些更麻烦的问题。
david@billdavid>su.bak
Password:
$PWD
$LOGNAME@$HOSTNAME>env
HOME=/
HOSTNAME=billdavid
HZ=100
LANG=zh_CN.GB18030
LD_LIBRARY_PATH=/usr/local/tinyq/lib::/usr/local/lib
LOGNAME=david
MAIL=/var/mail/david
MQCONFIGFILE=/export/home/david/config/msq.cfg
PATH=/usr/local/tinyq/bin:/usr/local/bin:/usr/ccs/bin:/usr/bin:
PS1=$PWD
$LOGNAME@$HOSTNAME> -------->这个问题很麻烦,下面详细说明
PWD=/export/home/david
QTDIR=/usr/local/tinyq
SHELL=/sbin/sh
TERM=vt100
TZ=PRC
_=/usr/local/bin/su.bak
在用户david的.profile文件中,我添加了如下内容,以将PS1更改为自己所希望的内容:
HOSTNAME=`hostname`
PS1='$PWD
$LOGNAME@$HOSTNAME>'
export HOSTNAME PS1
当用su.bak进行切换时,继承了上述环境变量,但由于使用的时单引号,不进行$的解析,从而出现了上述问题,提示符始终不变,但是为什么普通变量时可以让PS1随目录变化呢?
5、用GNU的su -切换到root用户,没有什么问题,执行了/etc/profile,但是在执行/etc/profile之前的还会执行其它的脚本吗?之后呢?希望有,这样我就可以在其中添加一些自己的东西了。
david@billdavid>su.bak -
Password:
Sun Microsystems Inc. SunOS 5.9 Generic_112234-03 November 2002
# env
HOME=/
LD_LIBRARY_PATH=/usr/local/tinyq/lib::/usr/local/lib
LOGNAME=root
PATH=/usr/local/tinyq/bin:/usr/local/bin:/usr/ccs/bin:/usr/ucb:/bin:/usr/bin:/etc
QTDIR=/usr/local/tinyq
SHELL=/sbin/sh
TERM=vt100
USER=root
#
此外,Solaris的sh好像也有点问题,好像不支持alias,root使用/sbin/sh时好像也不支持PWD环境变量,以至于在进行程序编译时总是出现目录错误。
|
这个问题是对Shell环境的概念不清晰导致的,su的执行是会重新启动一个子Shell,环境变量取决于那个Shell的环境设置,一般情况下:单执行su是不会重新读/etc/profile的,而su -就会读profile,把环境变量按profile中的设定设置。这个情况在linux下同样存在。
|
大部分问题我也不会,但是在PWD环境变量上,我一般的使用方法是PS1='$PWD:>' 在ksh和bash时使用良好,在sh下使用从未成功过。alias我在bash下使用也很正常,估计还是sh的问题。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。