GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Ssh – Kopieren geschützter Dateien zwischen Servern in einer Zeile?

Ich möchte squid.conf kopieren von einem Server zum anderen.

  • Die Server sprechen nicht miteinander. Ich möchte meinen Arbeitsplatz durchsuchen.
  • Beide Server haben die Datei, also wird sie auf dem Ziel überschrieben.
  • Die Dateien haben 600 Zugriffsrechte und sind im Besitz von root.
  • Root-Login über ssh ist deaktiviert (PermitRootLogin no ).
  • Ich möchte es möglichst in einer Zeile machen, da es Teil einer Einrichtungsanleitung sein wird.

Ich weiß zu tun

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

um Dateien zwischen Servern zu kopieren und Berechtigungen zu erhalten. In diesem Fall erhalte ich jedoch „Erlaubnis verweigert“.

Ich weiß auch, dass ich das kann:

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

Auf diese Weise das -t erlaubt sudo, nach dem Admin-Passwort zu fragen, bevor der Inhalt der Datei ausgegeben wird.

Das Problem ist, dass ich nicht weiß, wie ich diese Techniken zu etwas kombinieren soll, das auf jedem Server nach dem sudo-Passwort fragt und die Datei an ihr Ziel überträgt. Ist das möglich?

AKTUALISIEREN :Hier ist das Beste, was mir eingefallen ist:

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'

Dies einen Einzeiler zu nennen, scheint eine Strecke zu sein. Ich denke, ich werde es in der Einrichtungsanleitung einfach in einzelne Schritte aufteilen.

Akzeptierte Antwort:

Es ist einfacher, ssh mit ssh zu verketten als ssh mit sudo. Das Ändern der ssh-Serverkonfiguration ist also in Ordnung, ich schlage vor, ssh für root jedes Servers zu öffnen, aber nur von localhost. Sie können dies mit einem Match tun -Klausel in sshd_config :

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

Dann können Sie eine schlüsselbasierte Authentifizierungskette vom entfernten Benutzer zum lokalen Benutzer und vom lokalen Benutzer zum Root einrichten. Sie haben immer noch einen Authentifizierungspfad, sodass Ihre Protokolle Ihnen sagen, wer sich als root angemeldet hat, und die Authentifizierungsschritte sind die gleichen, als ob sudo beteiligt wäre.

Um sich als Root mit einem Server zu verbinden, definieren Sie einen Alias ​​in ~/.ssh/config so:

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

Wenn Sie darauf bestehen, sudo zu verwenden , ich glaube, Sie benötigen separate Befehle wie sudo besteht darauf, von einem Terminal zu lesen (selbst wenn es ein Ticket für Ihr Konto hat)¹, und keine der üblichen Dateikopiermethoden (scp, sftp, rsync) unterstützt die Interaktion mit einem entfernten Terminal.

Verwandte:Möglichkeit, einen Abschnitt einer Pipeline vollständig „durchzuleiten“?

Wenn Sie bei ssh und sudo bleiben, könnten Ihre vorgeschlagenen Befehle vereinfacht werden. Wenn Sie sudo so eingerichtet haben, dass es nicht erneut nach einem Passwort fragt, können Sie es auf jeder Seite einmal ausführen, um die Passwortanforderung zu überwinden, und ein anderes Mal, um die Datei zu kopieren. (Sie können die Datei nicht einfach direkt kopieren, da die Passwortabfrage im Weg ist.)

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'

¹ es sei denn, Sie haben NOPASSWD , aber dann würdest du das nicht fragen.


Linux
  1. So übertragen Sie Dateien zwischen Servern in Linux mit SCP und FTP

  2. Einzeilige Bedingungsüberprüfung im Makefile?

  3. Verschieben Sie alle Dateien bis auf eine

  4. Einzeiliger FTP-Server

  5. Verketten von Dateien und Einfügen einer neuen Zeile zwischen Dateien

Kopieren von Dateien unter Linux

So lesen Sie Dateien Zeile für Zeile in Bash

So synchronisieren Sie Dateien automatisch zwischen zwei Linux-Servern

4 Möglichkeiten zum Übertragen von Dateien zwischen Remote- und lokalen Systemen über SSH

So verwenden Sie Rsync zum Kopieren/Synchronisieren von Dateien zwischen Servern

Unterschied in Leerzeichen zwischen zwei Dateien unter Linux