更新

更新

我正在尝试$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 -当然,除非您使用“”形式)。

其他系统:

  • AIX手册页帮助不大,但由于该功能在两者中都很旧,因此行为可能基于相同的源代码。
  • 高性能用户体验系统手册页也没有帮助,说“之前定义的HOMEENV环境变量是已删除”。

因为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]"

相关内容