Não é possível obter o usuário $ HOME over su no Solaris e AIX

1

Estou tentando obter o usuário $HOME variable sobre o su.

Solaris

# su oracle
$ echo $HOME
/root

AIX

# su oracle
$ echo $HOME
/

Linux

# su oracle
$ echo $HOME
/home/oracle

Alguém pode explicar por que, no Solaris e no AIX, quando tento obter a variável $HOME , ele obtém o diretório $HOME da raiz?

UPDATE

Usando o login com - ou -l works, mas não posso usar su - no meu script. Alguma idéia de como superar isso?

Eu estava tentando não usar uma solução como a acima, mas estou ficando sem opções

cat /etc/passwd | grep oracle | cut -d: -f 6

ou como Thomas sugeriu:

cat /etc/passwd | awk -F: '$1 ~ /^'oracle'$/ {print $6;}'

    
por Bernardo Vale 06.03.2016 / 00:54

2 respostas

2

Na verdade (verificação rápida) su (de um usuário não privilegiado para outro usuário não privilegiado) no Solaris não modifica $HOME . Talvez você estivesse root ao emitir o comando su .

A página de manual do Solaris é omissa sobre o assunto, mas é um problema conhecido, citando um comentário do grupo de notícias :

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.

No entanto, a página de manual diz coisas sobre várias variáveis, mas não 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.

Essa última sentença pode ser interpretada para dizer que a variável HOME do usuário atual é passada sem alteração (a menos que você use o formulário " su - ", é claro).

Outros sistemas:

  • A página de manual do AIX é menos útil , mas como o recurso é muito antigo em ambos, o comportamento pode ser baseado no mesmo código-fonte.
  • A página de manual também não é útil, dizendo que as variáveis de ambiente HOME e ENV definidas são removidas .

Como su não está fornecendo as informações necessárias, uma abordagem diferente ajudaria. Se todas as suas contas forem contas locais (sem LDAP), você poderá pesquisar sempre /etc/passwd , por exemplo,

THATHOME=$( awk -F: '$1 ~ /^'$THATUSER'$/ {print $6;}' </etc/passwd )

Notas:

  • o formato de /etc/passwd é o mesmo em todos os sistemas semelhantes ao Unix.
  • usar awk para dividir o campo em campos evita o problema com um grep pegando a linha errada (ou linhas), por exemplo, se você tivesse uma conta oracleadmin .
  • Se você tivesse o LDAP, poderá ter o utilitário getent , o que permitiria a referência a usuários não locais.
por 06.03.2016 / 01:10
1

Isso é realmente simples, embora seja uma fonte comum de mal-entendido. Tão comum que tem uma entrada da Wikipedia :

Usage

When run from the command line, su asks for the target user's password, and if authenticated, grants the operator access to that account and the files and directories that account is permitted to access.

john@localhost:~$ su jane
Password:
jane@localhost:/home/john$ exit
logout
john@localhost:~$

When used with a hyphen (su -) it can be used to start a login shell. In this mode users can assume the user environment of the target user:

john@localhost:~$ su - jane
Password:
jane@localhost:~$

Para executar um comando no ambiente do usuário:

su - user -c "command [args]"
    
por 06.03.2016 / 15:14

Tags