Por que esse comando sudo tenta rodar em / root?

2

Eu tento executar um comando sudo via SSH assim:

ssh domain.com sudo -u user bash -c "cd /home/user/ && ls"

(que é obvio apenas um exemplo).

Eu volto:

/home/user/: line 0: cd: /root: Permission denied

Eu me pergunto por que o sudo tenta se transformar em / root?

    
por perler 20.08.2014 / 16:36

3 respostas

1

Parece-me que há duas maneiras de abordar isso:

  1. Focando em conseguir que seu comando seja executado no diretório correto. Para isso, sugiro o -i flag sudo, que irá configurar as coisas para ser um ambiente como se você estivesse logado como aquele usuário, então:

    ssh domain.com sudo -iu user ls
    
  2. Concentre-se em resolver o problema de citação, para que seu comando citado ainda possa ser tratado como um argumento para bash , para que ele seja executado como uma única cadeia de comando. Para isso, neste caso, parece que você só precisa de mais um nível de citação, assim:

    ssh domain.com sudo -u user bash -c "'cd /home/user/ && ls'"
    

    ou:

    ssh domain.com sudo -u user bash -c '"cd /home/user/ && ls"'
    

    Explicação: O shell em que você chama ssh ocupa um conjunto de aspas, passando ssh a seguinte lista de argumentos (usando o primeiro exemplo acima) (como argv , após argv[0] of ssh):

    1. domain.com
    2. sudo
    3. -u
    4. user
    5. bash
    6. -c
    7. 'cd /home/user && ls'

    Isso faz com que o sudo obtenha uma lista de argumentos de:

    1. -u
    2. user
    3. bash
    4. -c
    5. cd /home/user && ls

    qual sudo então analisa seus próprios argumentos, e então entrega o resto para bash de outra forma não modificado, de tal forma que o bash recebe os argumentos:

    1. -c
    2. cd /home/user && ls

    e o bash então toma seu segundo argumento como uma cadeia de comandos, como se tivesse sido digitado em um shell interativo, e então executa o primeiro comando ( cd /home/user ), também (por causa de && ) executando o comando segundo ( ls ) se o primeiro for bem sucedido.

Francamente, eu provavelmente iria com a primeira opção ... Mas a segunda também funciona para o seu exemplo trivial, e dependendo da realidade do seu problema real, pode ou não ser melhor para você.

    
por 21.08.2014 / 02:41
1

Ok, o conselho do Zoredache foi o que mais ajudou aqui:

quando você emite

ssh domain.com sudo -u user bash -c "cd /home/user/ && ls"

do host de origem, no host de destino, isso é realmente executado

sudo -u user bash -c cd /home/user/ && ls

que se traduz em

sudo -u user bash -c cd /root

como um cd sem um argumento muda para o diretório home e este não é o diretório home do usuário sudo, mas o diretório home do usuário que emite sudo (isto é, root)

a solução é escapar de todos os caracteres especiais como este

sudo -u user bash -c \"cd /home/ \&\& ls\"

mas tenho certeza que existe um jeito mais fácil, ou é?

    
por 20.08.2014 / 22:50
0

Você tem permissão para visualizar o diretório / ?

Se não, tente isto:

ssh domain.com sudo -u user bash -c "cd ~ && ls"

Se você fizer isso, tente executar isso:

ssh domain.com sudo -u user bash -c "cd /home/user/ && ls && whoami && groups user"
    
por 20.08.2014 / 17:04