我正在尝试$HOME
通过 su 获取用户变量。
索拉里斯
# su oracle
$ echo $HOME
/root
AIX
# su oracle
$ echo $HOME
/
Linux
# su oracle
$ echo $HOME
/home/oracle
有人可以解释为什么在 Solaris 和 AIX 上当我尝试获取$HOME
变量时它会获取根目录$HOME
吗?
更新
使用 with-
或登录可以-l
工作,但我无法su -
在我的脚本上使用。关于如何克服这个问题有什么想法吗?
我试图不使用上述解决方案,但我没有选择
cat /etc/passwd | grep oracle | cut -d: -f 6
或者正如托马斯建议的那样:
cat /etc/passwd | awk -F: '$1 ~ /^'oracle'$/ {print $6;}'
答案1
实际上(快速检查)su
(从非特权用户到另一个非特权用户)在 Solaris 上$HOME
根本没有修改。也许你是根发出命令时su
。
Solaris 手册页没有提到这个问题,但这是一个已知问题,引用自新闻组评论:
nails September 16, 2008 at 18:16:45
jefro:
Sorry I must disagree wtih you. At least in Solaris su <user id>
doesn't change the user environment - including environmental
variables. To change the environment, you must execute
su - <user id>
According to the su MAN page:
If the first argument to su is a dash (-), the environment will
be changed to what would be expected if the user actually logged
in as the specified user.
然而,手册页说了一些关于几个变量的事情,但没有HOME
:
o In addition to what is already propagated, the LC* and
LANG environment variables from the specified user's
environment are also propagated.
o Propagate TZ from the user's environment. If TZ is not
found in the user's environment, su uses the TZ value
from the TIMEZONE parameter found in
/etc/default/login.
o Set MAIL to /var/mail/new_user.
If the first argument to su is a dash (-), the environment
will be changed to what would be expected if the user actu-
ally logged in as the specified user. Otherwise, the
environment is passed along, with the exception of $PATH,
which is controlled by PATH and SUPATH in /etc/default/su.
最后一句可以解释为当前用户的HOME
变量不加更改地传递(su -
当然,除非您使用“”形式)。
其他系统:
因为su
没有为您提供所需的信息,所以不同的方法会有所帮助。如果您的帐户都是本地帐户(无 LDAP),您可以随时搜索/etc/passwd
,例如,
THATHOME=$( awk -F: '$1 ~ /^'$THATUSER'$/ {print $6;}' </etc/passwd )
笔记:
- 的格式
/etc/passwd
在所有类 Unix 系统上都是相同的。 - 使用
awk
将字段拆分为多个字段可以避免 grep 拾取错误行(或多行)的问题,例如,如果您有帐户oracleadmin
。 getent
如果您有 LDAP,则可能有允许引用非本地用户的实用程序。
答案2
这确实很简单,但却是误解的常见根源。如此常见,它有一个维基百科条目:
用法
从命令行运行时,su 会要求目标用户的密码,如果经过身份验证,则授予操作员对该帐户以及该帐户有权访问的文件和目录的访问权限。
john@localhost:~$ su jane Password: jane@localhost:/home/john$ exit logout john@localhost:~$
当与连字符 (su -) 一起使用时,它可用于启动登录 shell。 在此模式下,用户可以假设目标用户的用户环境:
john@localhost:~$ su - jane Password: jane@localhost:~$
要在用户环境下运行命令:
su - user -c "command [args]"