Como usar o ssh e o sudo juntos no bash?

7

Não consegui encontrar uma pergunta que descreva este cenário específico.

Estou tentando executar um script bash muito básico para recuperar log de várias máquinas. Estou executando o script localmente, mas preciso acessar uma máquina externa via ssh, bem como o sudo em um usuário privilegiado uma vez nessa máquina ...

ssh [email protected]
sudo su  - privledged_user
cat logs > file.txt

Executar isto com sh -x revela que o bash está ficando preso na linha 'ssh'. Então, tentei revisá-lo para isso:

ssh [email protected] sudo su - privledged_user cat logs > file.txt

Isso também parece parar por tempo indeterminado. Existe uma solução melhor para este problema? Eu não vejo uma maneira de usar o sudo su do que eu posso dizer ...

Obrigado por qualquer ajuda!

    
por Matt124234 29.12.2014 / 23:21

3 respostas

4

A maneira que eu faço isso no meu ambiente atual, é rodar o ssh com o -t flag que força a alocação do tty, e então rodar o sudo -u root dentro dele, como segue:

ssh -t hostname << EOF
  command1
  sudo -u root command2
  sudo -u otheruser "command3 | command4"
  sudo -u root /bin/bash -c "command5; command6; command7"
  command8 && ( sudo -u otheruser /bin/bash -c "cmd1 ${1}; cmd2 {$2}" ) || echo cmd2 did not work

EOF

Eu tenho minha conta em sudoers no lado remoto para que nenhuma senha seja necessária.

Este exemplo mostra diferentes maneiras de fazer isso em uma única sessão ssh, incluindo a execução de vários comandos com bash ou dentro de uma subshell. Note também que se você colocar o código acima em um script executável, você pode passar argumentos de linha de comando ($ 1 e $ 2) para ssh e estes serão expandidos e então referenciados no lado remoto.

    
por 29.12.2014 / 23:37
3

Se você não quiser ou não puder impedir que o sudo lhe pergunte a senha, um truque simples é lê-lo localmente e armazená-lo em uma variável local:

read -p 'Password: ' -s password

ssh -t [email protected] <<EOF
  echo "$password" | sudo -S whoami
EOF
    
por 29.06.2016 / 16:50
1

Se o sudo estiver configurado para permitir comandos sem senha, isso deve fazer o que você deseja:

ssh [email protected] "sudo su - privileged_user -c 'cat logs'" > file.txt

ou

ssh [email protected] "sudo su - privileged_user -c 'cat logs > file.txt'"

dependendo se você deseja que o arquivo file.txt seja criado local ou remotamente.

Caso contrário, aqui está uma maneira de passar a senha do usuário remoto para sudo :

echo mrhyner_password | \
  ssh [email protected] \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"
    
por 29.12.2014 / 23:38

Tags