Come eseguire le modifiche sul server remoto come root?


8

Mi chiedo se esiste un modo per eseguire uno script / comandi dal computer locale senza apportare modifiche come root sul computer remoto?

Qualche sfondo

Sto cercando di impostare alcune attività tramite Capistrano e ho bisogno di sudoaccesso. Ci sono circa 30 server e per me l'aggiornamento manuale /etc/sudoerssarà doloroso, quindi mi chiedevo se esiste un metodo per aggiornare questo file da remoto?


È possibile utilizzare Fabric con interazione remota. Puoi fare lo stesso senza interazione in parallelo usando il fabric.contrib.files.sedmetodo.
lcipriani,

Se hai 30 server che gestisci,
Wayne Werner il

Risposte:


18

È possibile eseguire script locali in remoto eseguendo bashsul sistema remoto e alimentandoli con lo script

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

modificare

Per eseguire i comandi che richiedono l'utilizzo sudosu una macchina remota utilizzare l' ssh's -topzione e passare i comandi a ssh. L' -topzione alloca uno psuedo tty e abilita l'interazione dell'utente con i comandi eseguitissh , come l'inserimento di una password persudo

$ ssh user@host -t 'sudo foo'

Si consiglia di modificare un file utilizzando questo metodo sedsu un reindirizzamento >poiché il reindirizzamento della shell non consente la scrittura di file durante l'utilizzo sudo. Inoltre, tutte le variabili nel sedcomando devono essere salvate quando vengono passate a ssh.

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

Per automatizzare il tutto:

#!/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

Grazie per la sceneggiatura e tutto il resto, ma in realtà non risponde alla mia domanda. Se desidero modificare il /etc/sudoersfile a causa dei permessi di root, fallirà.
kaizenCoder

@aspiringCodeArtisan vede le modifiche alla risposta
Creek

Ciao, anche questo richiede una sudopassword che da quello che ho capito è impostata in/etc/sudoers
kaizenCoder

1
@aspiringCodeArtisan Se il tuo account non ha sudodiritti su questi computer , per modificarlo /etc/sudoersdovrai accedere tramite ssh as root. Quindi il comando sarebbessh root@host -t 'sed -i "\$a text to insert" /path/to/file'
Creek

il login root ssh è disabilitato di default quindi non è un'opzione. Penso che potrei chiedere l'impossibile.
kaizenCoder

1

Ho trovato utile il teecomando per evitare la limitazione sudo sul reindirizzamento dei file. L'uso di sed si è rivelato frustrante a causa delle esigenze di fuga dei personaggi.

Questo è il comando che ho usato per aggiungere in remoto gli host per tutte le macchine nel mio cluster a / etc / hosts:

for i in {1..10}; do ssh ubuntu@10.1.1.$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"

L'output per ogni iterazione è simile al seguente:

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

Questa risposta di SU è stata fondamentale nella costruzione della mia soluzione finale: https://superuser.com/a/1026359/587485


1

Se è necessario eseguire più comandi o reindirizzamenti, è necessario utilizzare la sintassi seguente:

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

0

Prima di tentare di modificare il file sudoers, dovresti già avere una sorta di accesso a livello di root, sia tramite root root passwd diretto o il tuo ID utente sudo regola l'installazione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.