sudo não executando o bashrc como esperado

1

O problema geral é quando eu logar, meu prompt aparece corretamente formatado de acordo com o / etc / bashrc, mas quando eu sudo para outro usuário usando o bash, o prompt fica fubar'd.

Formatação essencial no / etc / bashrc

PROMPT_COMMAND='printf "3]0;%s@%s:%s
prompt_host='/bin/hostname'
7" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

... e ...

[email protected] pwd :

Sequência:

Eu entro no meu terminal como myuser. Meu prompt está formatado corretamente como correspondendo ao / etc / bashrc acima:

echo $SHELL     <---not very meaningful but I expect someone will ask me to run this
/bin/sh

ps -p 'echo $$'
  PID TTY          TIME CMD
 7105 pts/2    00:00:00 sh     <---which looks to be an interactive shell (no dash)

ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
72338     9321  9320  0 01:07 pts/3    00:00:00 -sh   <---or is it a login shell????

./filethatsnotthere.sh
-sh: ./filethatsnotthere.sh: No such file or directory

Embora o acima implique que meu programa shell padrão parece ser bash, acredito que estou usando sh:

getent passwd myuser
myuser:x:72338:25000:My Name:/home/myuser:/bin/sh

E por último, mas não menos importante ...

echo $prompt_host
the.hostname.fully.qualified

Além disso, é evidente que o / etc / profile está sendo originado porque:

 ls -l 'which sh'
lrwxrwxrwx. 1 root root 4 Jan 12  2018 /bin/sh -> bash

Parece que sh e que o / etc / profile está sendo originado. Mas isso me confunde ...

sudo -u newuser bash
newuser@ pwd         <---no hostname

... suspiro ... Mas mesmo se formos com a teoria de que estou usando sh, então sudo para newuser usando o bash. newuser tem uma configuração de perfil como newuser .bash_profile which sources newuser .bashrc que origina o / etc / bashrc.

Mas o prompt para newuser não está funcionando corretamente e é evidente que nenhum dos novos perfis de usuários é executado. Perde totalmente o nome do host no prompt

ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
newuser  11717 11715  0 03:47 pts/1    00:00:00 bash

ps -p 'echo $$'
  PID TTY          TIME CMD
11717 pts/1    00:00:00 bash

./filethatsnotthere.sh
bash: ./filethatsnotthere.sh: No such file or directory

Eu sei que NONE do novo perfil do usuário é executado porque eu coloco as instruções echo nelas para confirmar quando elas são executadas, e elas não são exibidas. Mesmo assim, eu confirmei que newuser está realmente executando o bash:

echo $prompt_host
<crickets....>

O / etc / profile não está sendo executado (o que faz sentido, já que se trata de um shell interativo, não de login):

PROMPT_COMMAND='printf "3]0;%s@%s:%s
prompt_host='/bin/hostname'
7" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'

MAS - os arquivos de inicialização do newuser não estão no diretório / home / newuser ... Então, se eu estou usando o sudo para um usuário com o comando bash, por que os arquivos de perfil bash do usuário não estão sendo fornecidos? Já que é um shell interativo, mesmo que o / etc / profile não esteja diretamente sendo gerado, eu ainda esperaria que os arquivos do newuser fossem executados.

    
por rup 29.09.2018 / 05:55

1 resposta

0

sudo pode ser configurado para definir $HOME para corresponder ao novo usuário ao alternar usuários ou não. No seu caso, parece que está configurado para não alternar $HOME . Isso pode ser útil quando você deseja alternar para contas de usuário que são dedicadas a aplicativos de serviço específicos, mas ainda deseja continuar usando sua configuração de shell pessoal e outras configurações.

E ~/.bashrc é na verdade apenas uma abreviação de $HOME/.bashrc .

Portanto, quando você executar sudo -u newuser bash , sudo alterará o nome de usuário para newuser , mas $HOME ainda será definido como /home/myuser .

Quando bash tenta executar ~/.bashrc , há um pequeno problema: como newuser , talvez não tenha acesso para ler /home/myuser/.bashrc , a menos que você conceda especificamente esse acesso. Se você não tiver, provavelmente é por isso que .bashrc está sendo ignorado. Como $HOME ainda está definido como /home/myuser , não haverá tentativa de executar /home/newuser/.bashrc .

Se você quiser que sudo defina HOME=/home/newuser , você pode:

  • use a opção -H com o comando sudo: sudo -Hu newuser bash
  • ou adicione Defaults>newuser always_set_home ao seu arquivo sudoers para definir automaticamente o diretório inicial ao alternar para newuser somente
  • ou adicione Defaults:myuser always_set_home ao arquivo sudoers para definir automaticamente o diretório inicial para corresponder à nova identidade quando myuser estiver executando qualquer comando sudo
  • ou adicione Defaults always_set_home ao arquivo sudoers para forçar esse comportamento para todos os comandos sudo no sistema. (Algumas distribuições do Linux têm isso habilitado por padrão).

Se você não quer mudar o diretório pessoal ao trocar de usuário, então você precisa ter certeza de que o novo usuário pode ler seus arquivos pessoais de inicialização do shell.

As permissões mínimas que você precisa para permitir que sudo -u newuser bash execute /home/myuser/.bashrc são:

  • uma permissão de pesquisa para /home/myuser
  • uma permissão de leitura para /home/myuser/.bashrc

Se não houver um grupo de usuários conveniente que seja comum a myuser e newuser , e as ACLs não estejam disponíveis (ou seja, somente permissões tradicionais no estilo Unix), essa seria a maneira tradicional de fazer isso:

chmod 711 /home/myuser          # i.e. directory permissions drwx--x--x
chmod 644 /home/myuser/.bashrc  # i.e. file permissions      -rw-r--r--

Se as ACLs estiverem disponíveis para o sistema de arquivos que contém seu diretório pessoal, você poderá fazer isso para conceder o acesso mínimo necessário:

setfacl -m u:newuser:x /home/myuser
setfacl -m u:newuser:r /home/myuser/.bashrc

Se as permissões do diretório inicial fossem inicialmente drwx------ , após esse comando, as permissões para /home/myuser seriam parecidas com drwx--x---+ . Para verificar a ACL completa, use getfacl :

$ getfacl /home/myuser
getfacl: Removing leading '/' from absolute path names
# file: home/myuser
# owner: myuser
# group: myuser
user::rwx
user:newuser:--x
group::---
mask::--x
other::---
    
por 29.09.2018 / 09:50