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 / user-281844

filbranden's questions

Martin Hope
filbranden
Asked: 2018-11-27 20:48:02 +0800 CST

"sudo -s <command>" executa o comando em um shell, mas curingas ou metacaracteres não funcionam

  • 8

Ao usar sudo -s(abreviação da opção "--shell" ), é possível passar um comando "sudo", nesse caso ele executará o comando em um shell iniciado por "sudo" como usuário de destino.

(Da mesma forma, sudo -i, também disponível como a opção "--login" , também inicia um shell e da mesma forma aceita um comando, que se comporta da mesma maneira.)

Executar comandos no sudo por meio de um shell pode ser importante em muitos casos:

  • Ao usar curingas em um diretório ao qual o usuário atual não tem acesso, mas o root tem, o comando precisa ser executado em um shell de root para que os curingas sejam expandidos adequadamente.
  • Executando um pipeline inteiro, muitos comandos encadeados em pipes ( |).
  • Ao executar um shell embutido, como for, if, etc. Executar um pequeno "script" inline inteiro em um único sudopode ser útil.

A documentação da opção "-s" diz (ênfase minha):

Execute o shell especificado pela SHELLvariável de ambiente se estiver definido ou o shell especificado pela entrada do banco de dados de senha do usuário que está chamando. Se um comando for especificado, ele será passado para o shell para execução por meio da opção -c do shell . Se nenhum comando for especificado, um shell interativo será executado. Observe que a maioria dos shells se comporta de maneira diferente quando um comando é especificado em comparação com uma sessão interativa; consulte o manual do shell para detalhes.

Em outras palavras, ao passar sudo -sum comando, ele é passado para o shell usando a -copção, que pega uma string com um "script" e depois passa a executá-lo como um script de shell.

A documentação não vai muito além sobre como usar esta opção, ou apresentar exemplos, exceto dizer "consulte o manual do shell para detalhes". Isso implica que o comando recebido é passado diretamente para a opção do shell -c. No entanto, como se vê, esse não é o caso.

Passar um script de shell com várias palavras falha:

$ sudo -s 'ls -ld /var/empty'
/bin/bash: ls -ld /var/empty: No such file or directory

A mensagem de erro indica que está tentando executar a string inteira como um comando simples... Hmmm, ok, então talvez adicionar espaços funcione? Sim, é o caso:

$ sudo -s ls -ld /var/empty
drwxr-xr-x. 3 root root 18 Jul 12 21:48 /var/empty

Mas não é bem assim que o shell -cfunciona... Bem, vamos tentar usar alguns metacaracteres, como ~, que é um atalho para o diretório home, para ver como isso se comporta. Observe as ~necessidades a serem citadas, para evitar que o shell não sudo o expanda (nesse caso, ele expandiria para a casa do usuário não root, em vez do /rootque é esperado):

$ sudo -s ls '~'
ls: cannot access '~': No such file or directory

Ok, então isso não funciona, e a saída de erro parece implicar que a expansão não está acontecendo, pois está preservando um literal ~lá.

E os curingas? Também não funciona:

$ sudo -s ls '/root/*.cfg'
ls: cannot access '/root/*.cfg': No such file or directory

Em ambos os casos, executar o comando com $SHELL -cfunciona bem. Nesse caso, $SHELLé bash, então:

$ sudo bash -c 'ls ~'
anaconda-ks.cfg
$ sudo bash -c 'ls /root/*.cfg'
/root/anaconda-ks.cfg

Uma exceção é que as variáveis ​​parecem funcionar em sudo -s, como:

$ sudo -s echo '$HOME'
/root

Então:

  • O que está acontecendo aqui?
  • Por que curingas e metacaracteres como ~não funcionam no comando passado para sudo -sou sudo -i?
  • Dado que $SHELL -crecebe uma única string com um script, mas sudo -srecebe vários argumentos, como o script é montado a partir dos argumentos?
  • Qual é uma maneira confiável de executar comandos em um shell via sudo?
shell sudo
  • 1 respostas
  • 1119 Views

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