Copia di file protetti tra server in una riga?


13

Vorrei copiare squid.confda un server all'altro.

  • I server non parlano tra loro. Mi piacerebbe passare attraverso la mia postazione di lavoro.
  • Entrambi i server hanno il file, quindi verrà sovrascritto sulla destinazione.
  • I file hanno il 600permesso e sono di proprietà di root.
  • login root tramite SSH è disabilitata ( PermitRootLogin no).
  • Mi piacerebbe farlo in una riga, se possibile, poiché farà parte di una guida all'installazione.

Lo so fare

ssh source 'tar czpf - -C /etc/squid/ squid.conf' | \
    ssh target 'tar xzpf - -C /etc/squid/'

per copiare file tra server e conservare le autorizzazioni. Tuttavia, in questo caso riceverò "Autorizzazione negata".

So anche che posso farlo:

ssh -t source 'sudo cat /etc/squid/squid.conf'

In questo modo -tconsente a sudo di richiedere la password dell'amministratore prima di inviare il contenuto del file.

Il problema è che non so come combinare quelle tecniche in qualcosa che chiederà la password sudo su ciascun server e trasferirà il file alla sua destinazione. È possibile?

AGGIORNAMENTO : Ecco il meglio che ho potuto inventare:

ssh -t source 'sudo tar czf /tmp/squid.tgz -C /etc/squid squid.conf' && \
ssh source 'cat /tmp/squid.tgz' | \
    ssh target 'cat >/tmp/squid.tgz' && \
ssh -t source 'sudo rm /tmp/squid.tgz' && \
ssh -t target \
    'sudo tar xzf /tmp/squid.tgz -C /etc/squid && sudo rm /tmp/squid.tgz'

Chiamare questo un one-liner sembra un tratto. Penso che lo analizzerò per separare i passaggi nella guida all'installazione.


Risposte:


11

È più facile concatenare ssh con ssh che concatenare ssh con sudo. Quindi cambiare la configurazione del server ssh è ok, suggerisco di aprire ssh per root di ciascun server, ma solo da localhost. Puoi farlo con una Matchclausola in sshd_config:

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

Quindi è possibile impostare una catena di autenticazione basata su chiave da utente remoto a utente locale e da utente locale a root. Hai ancora una traccia di autenticazione, quindi i tuoi log ti dicono chi ha effettuato l'accesso come root e i passaggi di autenticazione sono gli stessi di se fosse coinvolto sudo.

Per connettersi a un server come root, definire un alias in ~/.ssh/configquesto modo:

Host server-root
HostName server.example.com
User root
ProxyCommand "ssh server.example.com nc %h %p"

Se insisti nell'usare sudo, credo che avrai bisogno di comandi separati, poiché sudoinsiste nel leggere da un terminale (anche se ha un ticket per il tuo account) ¹, e nessuno dei soliti metodi di copia dei file (scp, sftp, rsync) supporta l'interazione con un terminale remoto.

Attenendosi a ssh e sudo, i comandi proposti potrebbero essere semplificati. Su ogni lato, se hai impostato sudo per non richiedere nuovamente una password, puoi eseguirlo una volta per superare i requisiti della password e un'altra volta per copiare il file. (Non è possibile copiare facilmente il file direttamente perché la richiesta della password si frappone.)

ssh -t source 'sudo true'
ssh -t target 'sudo true'
ssh -t source 'sudo cat squid.conf' |
ssh -t target 'sudo tee /etc/squid/squid.conf'

¹ A meno che tu non l'abbia fatto NOPASSWD, ma non te lo chiederesti.


La prima soluzione ha funzionato bene per me, ma la seconda linea dovrebbe essere Match host localhost.
cduck,

4

È possibile impostare sudoper non chiedere la password nel modo seguente:

Sulla fonte:

user    ALL=NOPASSWD:/bin/cat

Sull'obiettivo:

user    ALL=NOPASSWD:/usr/bin/tee

E fai sulla tua macchina:

ssh source 'sudo cat /test' | ssh target 'sudo tee /test'

Ma raccomando di usare qualcosa come una marionetta . È molto meglio e più facile risolve il problema con la distribuzione dei file di configurazione.

PS. A proposito, se ti imposterai sudoper chiedere la password all'utente, la stringa con [sudo] password for userverrà visualizzata nel file di destinazione.


+1 per suggerire un pupazzo, ma la tua soluzione sembra insicura. Potrei anche consentire l'accesso come root.
aggiunto il

2

Invece di usare ssh puoi usare scp per trasferire il file tra i server.

Accedi al server di destinazione:

Passare alla directory di destinazione in cui si desidera copiare il file.

#scp -r -p -P 22 root@source-ipaddress:/source-path-file-to-copy .

r - ricorsivo p - Preserva i tempi di modifica, i tempi di accesso e le modalità dal file originale


Questo presuppone che posso accedere come root, cosa che non posso. Aggiornamento della domanda.
aggiunto il

2

Senza modificare la configurazione di ssh, è possibile creare due tunnel ssh host-> server1 e server2-> host tramite la connessione ssh a server2. Collegare questi due tunnel sul computer host (stessa porta). Ed esegui sudo su server2 per recuperare i dati dai tunnel collegati su server1 e salvarli su server2.

ssh -L60000:${source}:22 -R60000:localhost:60000 -t ${target} 'sudo bash -c "ssh -p 60000 '$(whoami)'@localhost \"cd /path/to/dir; tar -czf - files\"|tar -C/path/to/target -xzf -"'

L'idea è: 1- per creare un tunnel locale dalla propria macchina alla macchina sorgente sulla porta 60000

ssh -L60000:${source}:22

1b- Crea un tunnel remoto per tornare alla tua macchina

-R60000:localhost:60000

2- connettersi alla macchina target

-t ${target}

3- eseguire tutto come root sul computer di destinazione per la scrittura

'sudo bash -c "..."'

4- connettersi alla macchina sorgente attraverso il tunnel. whoami e su localhost che significano localhost sul computer $ {target}.

ssh -p 60000 '$(whoami)'@localhost

5- impacchettare i file remoti e inviarli zippati a stdout

cd /path/to/dir; tar -czf - file

6- riceve il pacchetto tramite stdout ed estrae i file di conseguenza nella directory / path / to / target

|tar -C/path/to/target -xzf -

Nota: è possibile ricevere fino a 3 conferme sshkey e 3 richieste di password. Ma i file verranno copiati.

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.