Como executar alterações no servidor remoto como root?

8

Gostaria de saber se existe uma maneira de executar um script / comandos da máquina local sem fazer nenhuma modificação como root na máquina remota?

Alguma experiência

Estou tentando configurar algumas tarefas via Capistrano e preciso de sudoacesso. Existem cerca de 30 servidores ou mais, e eu atualizar manualmente /etc/sudoersserá doloroso, então eu queria saber se existe um método para atualizar esse arquivo remotamente?

kaizenCoder
fonte
Você pode usar o Fabric que possui interação remota. Você pode fazer o mesmo sem interação em paralelo usando o fabric.contrib.files.sedmétodo
Lcipriani
Se você possui 30 servidores gerenciados, recomendo o SaltStack
Wayne Werner

Respostas:

18

Você pode executar scripts locais remotamente executando bashno sistema remoto e alimentando-o com seu script

$ ssh user@host 'bash -s' < script.sh

Editar

Para executar comandos que exigem o uso sudoem uma máquina remota, use a ssh's -topção e passe os comandos para ssh. A -topção aloca um psuedo tty e permite a interação do usuário com os comandos executados ssh, como digitar uma senha parasudo

$ ssh user@host -t 'sudo foo'

Para modificar um arquivo usando esse método, sedé recomendado um redirecionamento, >porque o redirecionamento do shell não permite gravar arquivos durante o uso sudo. Além disso, todas as variáveis ​​no sedcomando precisam ser escapadas quando são passadas para ssh.

$ ssh user@host -t 'sudo sed -i "\$a text to insert" /path/to/file'

Para automatizar a coisa toda:

#!/bin/bash
SERVERS=( server1 server2 server3 )

for HOST in ${SERVERS[@]}; do 
    ssh user@${HOST} -t 'sudo sed -i "\$a text to insert" /path/to/file'

    if [[ $? -ne 0 ]]; then
        echo "ERROR: $HOST did not complete"
     else   
        echo "$HOST complete"
    fi   
done
Riacho
fonte
Obrigado pelo script e tudo, mas ele realmente não responde à minha pergunta. Se eu desejar modificar o /etc/sudoersarquivo devido às permissões de root, ele falhará.
kaizenCoder
@aspiringCodeArtisan ver edições da resposta
Creek
Oi, mesmo que solicita uma sudosenha, que pelo que entendi é fixado em/etc/sudoers
kaizenCoder
1
@aspiringCodeArtisan Se sua conta não possui sudodireitos sobre essas máquinas, para modificar, /etc/sudoersvocê precisará fazer login via ssh as root. Então o comando seriassh root@host -t 'sed -i "\$a text to insert" /path/to/file'
Creek
o login root ssh está desativado por padrão, portanto não é uma opção. Eu acho que posso estar pedindo o impossível.
kaizenCoder
1

Eu achei o teecomando útil para evitar a limitação do sudo no redirecionamento de arquivos. Usar sed provou ser frustrante devido a requisitos de escape de caracteres.

Este é o comando que eu usei para anexar remotamente os hosts de todas as máquinas do meu cluster ao / etc / hosts:

for i in {1..10}; do ssh [email protected].$i -t "echo '10.1.1.1 dev-1    
10.1.1.4 dev-4
10.1.1.3 dev-3
10.1.1.2 dev-2
10.1.1.6 dev-6
10.1.1.8 dev-8
10.1.1.5 dev-5
10.1.1.10 dev-10
10.1.1.9 dev-9
10.1.1.7 dev-7' | sudo tee -a /etc/hosts >/dev/null"

A saída para cada iteração é assim:

0+1 records in
0+1 records out
255 bytes (255 B) copied, 4.1338e-05 s, 6.2 MB/s

Esta resposta SU foi fundamental na criação da minha solução final: https://superuser.com/a/1026359/587485

Garren
fonte
1

Se você precisar executar vários comandos ou redirecionamentos, use a seguinte sintaxe:

ssh server.com "sudo sh -c 'ps aux | grep jav > /root/1.txt'"
riverfall
fonte
0

Você já teria que ter algum tipo de acesso no nível da raiz, através da senha direta da raiz ou da configuração da regra sudo da sua ID de usuário antes de tentar modificar o arquivo sudoers.

jag4701
fonte