Existe alguma maneira de definir DEBIAN_FRONTEND=noninteractive
ao executar um script remotamente via SSH?
Fazendo isso, recebo este erro:
sudo: sorry, you are not allowed to set the following environment variables: DEBIAN_FRONTEND
A razão pela qual desejo definir DEBIAN_FRONTEND=noninteractive
exatamente neste local é porque às vezes apt-get dist-upgrade
mostra uma máscara para alguma interação do usuário (whiptail). Como deseja executar este script remotamente, crontab -e
não há nenhum ser humano para clicar ou pressionar nada. Portanto, preciso desligar isso, caso contrário o script permaneceria travado.
O script que estou tentando executar está localizado server_one
em /usr/local/bin/perform-update
:
#!/bin/bash
sudo apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get -y dist-upgrade
sudo apt-get -y autoremove
sudo snap refresh
Eu tento chamá-lo server_two
usando este comando:
SERVER_COMMAND="perform-update"
ssh -i $HOME/.ssh/id_rsa backupuser@server_one $SERVER_COMMAND
Também defini os direitos apropriados para backupuser
on server_one
in sudo visudo
:
backupuser ALL=(ALL) NOPASSWD: /usr/local/bin/perform-update
backupuser ALL=(ALL) NOPASSWD: /usr/bin/apt-get
backupuser ALL=(ALL) NOPASSWD: /usr/bin/snap
Você poderia permitir que o usuário defina a
DEBIAN_FRONTEND
variável ao usarsudo
, mas ... você concedeu permissão para o usuário executar o script usandosudo
, então não há razão para usarsudo
dentro do script. Basta executar o próprio script comsudo
.Mude seu script para:
E então execute-o usando:
Dito isto , você deveria usar
unattended-upgrades
em vez de reinventar a roda.Para o caso específico de permitir que um usuário defina uma variável de ambiente para um comando específico, adicione a
SETENV
tag além daNOPASSWD
tag. Deman sudoers
:Então a regra deveria ficar assim:
Para todos os efeitos e propósitos práticos, consulte a resposta de @muru . Se estiver com pressa, apenas a
sudo
alteração nassh
linha em server_two é necessária, e o/usr/local/bin/perform-update
script em server_one não precisa ser editado. Mas por questões de segurança, ele deve ser seguido na íntegra, além da minha edição no final da minha resposta.E se considerarmos as coisas de outra maneira? E se não pudéssemos alterar o comando em server_two e só pudéssemos alterar o comando em server_one? Eu estava procurando uma opção do APT para definir apenas uma variável de ambiente, mas encontrei mais do que esperava. Aqui está uma resposta ultrajante e pronta para uso apenas para demonstrar que sua
/etc/sudoers
apólice precisa ser protegida.Não acho que você pretendesse dar
backupuser
acesso root completo. Para proteger seu sistema, você precisa remover as linhasapt-get
e seguir a resposta de @muru.snap
visudo
EDIT: Exceto que você precisa remover
apt-get
a linha emvisudo
. Essas 3 linhas devem ser substituídas apenas pela primeira linha: