Como usar ssh e sudo juntos no bash?

10

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

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

ssh myuser@machine.net
sudo su  - privledged_user
cat logs > file.txt

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

ssh myuser@machine.net sudo su - privledged_user cat logs > file.txt

Isso também parece parar indefinidamente. Existe uma solução melhor para este problema? Não vejo uma maneira de usar o sudo su pelo que posso dizer ...

Obrigado por qualquer ajuda!

Matt124234
fonte
Por que a votação apertada? Esta pergunta está relacionada ao tópico: gerenciamento de hardware ou software de servidores, estações de trabalho, armazenamento ou redes, ferramentas usadas para administrar, monitorar ou automatizar essas
opções

Respostas:

5

A maneira como consegui isso no meu ambiente atual é executar o ssh com o -tsinalizador que força a alocação de tty e, em seguida, executar o sudo -u root dentro dele, da seguinte maneira:

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 no sudoers no lado remoto, para que nenhuma senha seja necessária.

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

Michael Martinez
fonte
Infelizmente, por não gerenciar o servidor remoto, acredito que estou preso usando o sudo su aqui. Isso ainda funcionaria neste formato?
Matt124234
sim vai funcionar também. você pode inserir a senha quando solicitado.
Michael Martinez
Eu tentei: ssh -t [email protected] << EOF sudo su - adcentrl egrep 'ERRO \ | WARN' / home / adcentrl / cronjobs / logs / * / * EOF Mas recebi: "Pseudo -terminal não será alocado porque stdin não é um terminal. "
Matt124234
perfeitamente bem. ignore esse aviso e continue. se você quiser, pode desabilitar "RequireTty" em / etc / sudoers no lado remoto #
Michael Martinez
5

Se você não deseja ou não pode impedir o sudo de solicitar a senha, um truque simples é lê-lo localmente e armazená-lo em uma variável local:

read -p 'Password: ' -s password

ssh -t user@1.2.3.4 <<EOF
  echo "$password" | sudo -S whoami
EOF
xpmatteo
fonte
1

Se o sudo estiver configurado para permitir comandos sem senha, faça o que você deseja:

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs'" > file.txt

ou

ssh myuser@machine.net "sudo su - privileged_user -c 'cat logs > file.txt'"

dependendo se você deseja que o file.txtarquivo 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 mrhyner@test-server.net \
  "sudo -S su - adcentrl -c 'egrep ERROR\|WARN /home/adcentrl/cronjobs/logs/*/*'"
jlliagre
fonte
Muito interessante. No entanto, usar ssh sem -t me diz "no tty present". A adição de -t remove esse erro, mas parece não respeitar 'sudo su', pois solicita uma senha. Aqui está especificamente o que estou fazendo: ssh -t [email protected] "sudo su - adcentrl -c egrep" ERRO \ | WARN "/ home / adcentrl / cronjobs / logs / * / *" Isso me dá: bash : WARN: comando não encontrado [sudo] senha para mrhyner:
Matt124234
Desculpe, eu aparentemente não sei como formatar os meus comentários nesta coisa
Matt124234
Eu estava assumindo que o sudo estava configurado para não ter senha para sua conta remota.
Jlliagre
e você está faltando aspas simples extras.
Jlliagre
É, o que me levou a pensar que o bash não está honrando o comando ssh por algum motivo. Está agindo como se eu estivesse tentando fazer sudo do meu host local = \
Matt124234