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 / unix / Perguntas / 510855
Accepted
Rakib Fiha
Rakib Fiha
Asked: 2019-04-06 22:29:39 +0800 CST2019-04-06 22:29:39 +0800 CST 2019-04-06 22:29:39 +0800 CST

sudo sem sudo, implicando sudo no script

  • 772

Eu fiz alguns scripts contendo algumas funções que, por design, precisam de permissão sudo. Eu adicionei esses caminhos em .bashrcfor Linuxe .bash_profilefor MacOSpara que ele possa ser chamado de qualquer lugar.

Mas não quero que o usuário digite sudotoda vez que quiser chamar essas funções de script. Existe alguma maneira que eu possa implicar sudode uma maneira que sempre que essas funções forem chamadas, o terminal assumirá que está sendo chamado pelo usuário root?

Acho que devo apenas adicionar sudo -ino início do script ou talvez cada função? Ou existe alguma outra maneira alternativa de implicar sudo? Além disso, seria ótimo saber se você acha que seria terrível ou perigoso sugerir sudo e se não é recomendado.

Um exemplo de dangerous-functionscript que contém algumas funções que estou tentando realizar sem especificarsudo

#!/bin/bash
start-one()
{
    ## do dangerous stuff with sudo
    systemctl start dangerous.service
}

start-two()
{
    systemctl start dangerous1.service
}

start-launchwizard()
{
    systemctl start dangerous2.service
}

## Calling functions one by one...
"$@"

Eu não quero chamá-los por sudo dangerous-function start-one eu só quero chamá-los com, dangerous-function start-onemas ainda obter o mesmo resultado que o anterior.

bash shell
  • 2 2 respostas
  • 4000 Views

2 respostas

  • Voted
  1. Best Answer
    Kusalananda
    2019-04-06T23:38:49+08:002019-04-06T23:38:49+08:00

    O "$@"será expandido para a lista de argumentos de linha de comando, citados individualmente. Isso significa que se você chamar seu script com

    ./script.sh start-one
    

    ele será executado start-onenesse ponto (que é sua função). Isso também significa que invocá-lo como

    ./script.sh ls
    

    iria rodar ls.

    Permitir que um usuário invoque o script usando sudo(ou usando sudodentro do script) permitiria que ele executasse qualquer comando como root, se tivesse sudoacesso. Você não quer isso.

    Em vez disso, você precisaria validar cuidadosamente os argumentos da linha de comando. Talvez algo como

    foo_func () {
        # stuff
        printf 'foo:\t%s\n' "$@"
    }
    
    bar_func () {
        # stuff
        printf 'bar:\t%s\n' "$@"
    }
    
    arg=$1
    shift
    
    case $arg in
        foo)
            foo_func "$@" ;;
        bar)
            bar_func "$@" ;;
        *)
            printf 'invalid sub-command: %s\n' "$arg" >&2
            exit 1
    esac
    

    Teste:

    $ sh script.sh bar 1 2 3
    bar:    1
    bar:    2
    bar:    3
    
    $ sh script.sh baz
    invalid sub-command: baz
    

    Isso seria mais seguro de usar com sudo, mas você ainda não desejaria executar nada que o usuário fornecesse a você dentro de suas várias funções diretamente sem limpar a entrada. O script acima faz isso restringindo o usuário a um conjunto específico de subcomandos, e cada função que manipula um subcomando não executa eval, ou sourceseus argumentos.

    Deixe-me dizer isso novamente com outras palavras: O script não tenta, e não deve, tentar executar a entrada do usuário como código de forma alguma . Ele não deve tentar descobrir se um argumento corresponde a uma função no ambiente atual que ele pode executar (funções podem ter sido colocadas lá pelo ambiente de chamada) e não deve executar scripts cujos nomes de caminho foram fornecidos na linha de comando etc.

    Se um script estiver executando tarefas administrativas, eu esperaria ter que executá-lo com sudo, e não gostaria que o próprio script me pedisse minha senha, especialmente se for um script que eu queira executar de forma não interativa ( por exemplo, de um cron job). Ou seja, um script que executa tarefas administrativas que exigem privilégios de root deve (IMHO) ser capaz de assumir que está sendo executado com os privilégios corretos desde o início.

    Se você quiser testar isso no script, você pode fazê-lo com

    if [ "$( id -u )" -ne 0 ]; then
        echo 'please run this script as root' >&2
        exit 1
    fi
    

    Em seguida, ele move a decisão de como executar o script com privilégios de root para o usuário do script.

    • 5
  2. user5325
    2019-04-06T23:12:37+08:002019-04-06T23:12:37+08:00

    Você pode adicionar seu script /etc/sudoers(de preferência usando `visudo) para que seja acessível ao usuário.

    user ALL= /path/to/script
    

    Então o usuário poderá executar path/to/scriptsem sudo.

    • 2

relate perguntas

  • Problema estranho ao passar variáveis ​​do arquivo de texto

  • Enquanto a linha lê mantendo os espaços de escape?

  • Como salvar um caminho com ~ em uma variável?

  • ordem de substituição de processos `te` e `bash`

  • Execute um script muito lento até que seja bem-sucedido

Sidebar

Stats

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

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

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