GNU/Linux >> Linux Esercitazione >  >> Linux

Ssh:copiare file protetti tra server in una riga?

Vorrei copiare squid.conf da un server all'altro.

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

So di fare

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

per copiare file tra server e preservare 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 il -t consente a sudo di richiedere la password di amministratore prima di emettere il contenuto del file.

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

AGGIORNAMENTO :Ecco il meglio che sono riuscito a trovare:

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'

Chiamarlo one-liner sembra un tratto. Penso che lo analizzerò in passaggi separati nella guida all'installazione.

Risposta accettata:

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

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

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

Per connetterti a un server come root, definisci un alias in ~/.ssh/config così:

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, come sudo insiste a 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.

Correlati:il modo per specificare che una sezione di una pipeline sia completamente "passa attraverso"?

Rimanendo con ssh e sudo, i comandi proposti potrebbero essere semplificati. Su ogni lato, se hai impostato sudo per non chiedere più una password, puoi eseguirlo una volta per superare il requisito della password e un'altra volta per copiare il file. (Non puoi copiare facilmente il file direttamente perché la richiesta della password si intromette.)

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 abbia NOPASSWD , ma allora non lo chiederesti.


Linux
  1. Come trasferire file tra server in Linux utilizzando SCP e FTP

  2. Stampa due file in due colonne?

  3. Linee comuni tra due file?

  4. Sposta tutti i file tranne uno

  5. Server FTP a una linea

Copiare file in Linux

Come leggere i file riga per riga in Bash

Come sincronizzare automaticamente i file tra due server Linux

4 modi per trasferire file tra sistemi remoti e locali su SSH

Come utilizzare Rsync per copiare/sincronizzare file tra server

Differenza negli spazi bianchi tra due file su Linux