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!


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.


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 mrhyner@stg-app3.indeed.net << 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

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/*/*'"

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 mrhyner@test-server.net "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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.