AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1501934
Accepted
Socrates
Socrates
Asked: 2024-01-31 18:42:02 +0800 CST2024-01-31 18:42:02 +0800 CST 2024-01-31 18:42:02 +0800 CST

Configurando DEBIAN_FRONTEND remotamente

  • 772

Existe alguma maneira de definir DEBIAN_FRONTEND=noninteractiveao 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=noninteractiveexatamente neste local é porque às vezes apt-get dist-upgrademostra uma máscara para alguma interação do usuário (whiptail). Como deseja executar este script remotamente, crontab -enã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_oneem /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_twousando este comando:

SERVER_COMMAND="perform-update"
ssh -i $HOME/.ssh/id_rsa backupuser@server_one $SERVER_COMMAND

Também defini os direitos apropriados para backupuseron server_onein 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
command-line
  • 2 2 respostas
  • 56 Views

2 respostas

  • Voted
  1. Best Answer
    muru
    2024-01-31T18:45:52+08:002024-01-31T18:45:52+08:00

    Você poderia permitir que o usuário defina a DEBIAN_FRONTENDvariável ao usar sudo, mas ... você concedeu permissão para o usuário executar o script usando sudo, então não há razão para usar sudo dentro do script. Basta executar o próprio script com sudo.

    Mude seu script para:

    #! /bin/bash
    apt-get update
    DEBIAN_FRONTEND=noninteractive apt-get -y dist-upgrade
    DEBIAN_FRONTEND=noninteractive apt-get -y autoremove
    snap refresh
    

    E então execute-o usando:

    ssh -i "$HOME/.ssh/id_rsa" backupuser@server_one sudo "$SERVER_COMMAND"
    

    Dito isto , você deveria usar unattended-upgradesem 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 SETENVtag além da NOPASSWDtag. De man sudoers:

     SETENV and NOSETENV
    
       These tags override the value of the setenv flag on a per-command basis.  If SETENV has
       been set for a command, the user may disable the env_reset flag from the command line via
       the -E option.  Additionally, environment variables set on the command line are not
       subject to the restrictions imposed by env_check, env_delete, or env_keep.  As such, only
       trusted users should be allowed to set variables in this manner.  If the command matched
       is ALL, the SETENV tag is implied for that command; this default may be overridden by use
       of the NOSETENV tag.
    

    Então a regra deveria ficar assim:

    backupuser      ALL=(ALL) NOPASSWD:SETENV: /usr/bin/apt-get
    
    • 3
  2. Daniel T
    2024-01-31T19:51:29+08:002024-01-31T19:51:29+08:00

    Para todos os efeitos e propósitos práticos, consulte a resposta de @muru . Se estiver com pressa, apenas a sudoalteração na sshlinha em server_two é necessária, e o /usr/local/bin/perform-updatescript 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/sudoersapólice precisa ser protegida.

    #!/bin/bash
    # Put this in /usr/local/bin/perform-update
    # No need to manually change any other file
    
    # Use the -o to inject any arbitrary apt-config option.
    # First write a wrapper file to execute later that
    # sets up DEBIAN_FRONTEND=noninteractive and passes on the arguments.
    sudo apt-get update -o APT::Update::Pre-Invoke::='echo '\'$'#!/bin/sh\nexport DEBIAN_FRONTEND=noninteractive\nexec /usr/bin/dpkg "$@"'\'' > /usr/dpkg; chmod 700 /usr/dpkg'
    # Then use -o again to make dist-upgrade use the wrapper.
    sudo apt-get -y dist-upgrade -o Dir::Bin::dpkg=/usr/dpkg
    # autoremove should use DEBIAN_FRONTEND=noninteractive too because
    # removing some packages like display managers may cause prompting.
    sudo apt-get -y autoremove -o Dir::Bin::dpkg=/usr/dpkg
    sudo snap refresh
    

    Não acho que você pretendesse dar backupuseracesso root completo. Para proteger seu sistema, você precisa remover as linhas apt-gete seguir a resposta de @muru.snapvisudo

    EDIT: Exceto que você precisa remover apt-geta linha em visudo. Essas 3 linhas devem ser substituídas apenas pela primeira linha:

    backupuser      ALL=(ALL) NOPASSWD: /usr/local/bin/perform-update
    
    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve