sudo su - << 'EOF' # do stuff... EOF
Isso funciona, mas com uma limitação: o script é passado para o shell em sua entrada padrão, portanto, você não pode usar a entrada padrão para outra coisa, como ler o nome do usuário para criar.
A maneira simples de manter a entrada padrão é passar o comando shell como um argumento.
Observe que sudo su
é redundante - sudo
executa o comando especificado como root e esse é o único propósito de su
também. Use sudo -i
em vez de sudo su -
se você deseja executar um shell de login como root - o que provavelmente é desnecessário aqui - ou sudo sh
para executar um shell como root.
sudo sh -c '
# do stuff...
'
Isso dificulta o uso de uma aspa simples no snippet do shell. Você pode usar '\''
para colocar uma aspa simples dentro do literal entre aspas simples. Se você quiser manter a estrutura do documento aqui, existem várias maneiras. O mais simples é passar o documento aqui em um descritor diferente . No entanto, isso requer que a opção closefrom_override
seja ativada na configuração do sudo, o que não é o caso por padrão; por padrão, sudo
fecha todos os descritores de arquivos, exceto stdin, stdout e stderr.
sudo -C 3 sh -c '. /dev/fd/3' 3<<'EOF'
# do stuff...
EOF
Se você quiser que seu código seja portável para máquinas onde esta opção não está ativada, você pode ler o script de um heredoc e passá-lo para o shell como um argumento.
script=$(cat <<'EOF'
# do stuff...
EOF
)
sudo sh -c "$script"
Como alternativa, se você quiser que o script sudo possa ler a partir do terminal, pode passar o corpo do script na entrada padrão. Uma limitação dessa abordagem é que ela não permite que a entrada do script geral seja redirecionada.
sudo sh <<'EOF'
exec </dev/tty
# do stuff...
EOF