Como ter acesso a variáveis de script e variáveis ambientais dentro de uma cláusula sudo / EOF em um script… BASH

0

PROBLEMA:

Eu estou lutando com isso cp sempre dando erros porque as variáveis não estão lá ...

Aqui está o meu código:

if [ ! -z "$USER1" ]
then
     sudo -u "$USER1" bash <<'EOF'
     sleep 5
     BASHRC=.bashrc
     cp "$BASHRC" "$HOME"/.bashrc
     sleep 5
     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
     sleep 5
     echo 'eval $(dircolors -b $HOME/.dircolors)' >> "$HOME"/.bashrc
     . "$HOME"/.bashrc
     sleep 5
     echo "Here is LS_COLORS in action: "
     ls -l "$HOME"
EOF
fi

PERGUNTAS:

Como tornar minhas variáveis de script e variáveis ambientais acessíveis dentro das cláusulas sudo (existem muitas)?

É sudo ou é aqui-documento que tem um problema com isso?

EDITAR:

Remover as aspas no EOF me dá um problema anterior:

./testing3892739.sh billy
cp: failed to access '/root/.bashrc': Permission denied

EDIT2:

Agora o script é assim ...

    if [ ! -z "$USER1" ]
108 then
109     sudo -i -u "$USER1" bash <<'EOF'
110     sleep 5
111     cp -f .bashrc "$HOME"/.bashrc
112     sleep 5
113     wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O "$HOME"/.dircolors
114     sleep 5
115     echo 'eval $(dircolors -b $HOME/.dircolors)' >> "$HOME"/.bashrc
116     . "$HOME"/.bashrc
117     sleep 5
118     echo "Here is LS_COLORS in action: "
119     ls -l "$HOME"
120 EOF
121 fi

a mudança de -i para sudo fez a diferença no último problema .... mas como de costume e há algum tempo e muitos erros diferentes, cp dá um erro e agora é

cp: '.bashrc' and '/home/billy/.bashrc' are the same file

O arquivo existe, mas eu preciso que ele seja sobrescrito.

Eu simplesmente quero meu script em cp do arquivo oculto .bashrc do atual dir , que pode estar em qualquer lugar, pois é o diretório que o script reside e arquivos necessários para a atualização do servidor em $HOME e sobrescrever se existir.

    
por somethingSomething 18.08.2018 / 23:37

2 respostas

1

Então (com base nos comentários) você deseja que .bashrc se refira a um arquivo no diretório do qual sudo é invocado; mas $HOME para expandir para o diretório inicial do usuário de destino. Eu acho que a maneira de fazer isso é usar -H :

 -H, --set-home
             Request that the security policy set the HOME environment
             variable to the home directory specified by the target user's
             password database entry.  Depending on the policy, this may
             be the default behavior.

Para ilustrar:

$ sudo -Hu testuser bash -c 'echo \$PWD = $PWD; echo \$HOME = $HOME' 
$PWD = /home/steeldriver/forums/tests
$HOME = /home/testuser

Considerando que com "regular" sudo $HOME resolve para o usuário que faz a chamada

$ sudo -u testuser bash -c 'echo \$PWD = $PWD; echo \$HOME = $HOME'
$PWD = /home/steeldriver/forums/tests
$HOME = /home/steeldriver

enquanto com um shell de login $HOME resolve o do usuário de destino - mas o diretório de trabalho também é alterado:

$ sudo -iu testuser bash -c 'echo \$PWD = $PWD; echo \$HOME = $HOME'
/home/testuser = /home/testuser
/home/testuser = /home/testuser

nenhum dos quais é muito útil em sua aplicação.

Tenha em mente que sudo é bastante configurável e o comportamento padrão pode ser diferente dependendo do seu sabor e distribuição precisos do Unix / Linux.

    
por 19.08.2018 / 04:39
1

Você está usando <<'EOF' . Se você usar <<EOF sem as aspas, seu shell expandirá as variáveis. Se houver variáveis que você não deseja expandir pelo seu shell, cite-as com \$ .

    
por 18.08.2018 / 23:42