Geschützte Dateien zwischen Servern in einer Zeile kopieren?

13

Ich möchte squid.confvon einem Server auf einen anderen kopieren .

  • Die Server sprechen nicht miteinander. Ich möchte meine Workstation durchgehen.
  • Beide Server haben die Datei, daher wird sie auf dem Ziel überschrieben.
  • Die Dateien haben die 600Berechtigung und gehören root.
  • root login via ssh ist deaktiviert ( PermitRootLogin no).
  • Ich würde es gerne in einer Zeile tun, wenn es möglich ist, da es Teil einer Installationsanleitung sein wird.

Ich weiß es zu tun

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

Kopieren von Dateien zwischen Servern und Beibehalten von Berechtigungen. In diesem Fall erhalte ich jedoch die Meldung "Erlaubnis verweigert".

Ich weiß auch, dass ich das kann:

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

Auf diese Weise -tkann sudo das Administratorkennwort anfordern, 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 ihren Zielort überträgt. Ist das möglich?

UPDATE : Hier ist das Beste, was ich mir einfallen lassen konnte:

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 als Einzeiler zu bezeichnen, scheint eine Strecke zu sein. Ich denke, ich werde es nur aufteilen, um Schritte in der Setup-Anleitung zu trennen.

itsadok
quelle
Verwandte Themen
Gilles 'SO - hör auf, böse zu sein'

Antworten:

11

Es ist einfacher, ssh mit ssh zu verketten, als ssh mit sudo zu verketten. Das Ändern der SSH-Serverkonfiguration ist also in Ordnung. Ich empfehle, SSH für das Stammverzeichnis jedes Servers zu öffnen, jedoch nur von localhost aus. Sie können dies mit einer MatchKlausel in sshd_config:

PermitRootLogin no
Match Host localhost
    PermitRootLogin yes

Anschließend können Sie eine schlüsselbasierte Authentifizierungskette von Remote-Benutzer zu lokalem Benutzer und von lokalem Benutzer zu Root einrichten. Sie haben immer noch einen Authentifizierungspfad, sodass in Ihren Protokollen angegeben ist, wer sich als root angemeldet hat, und die Authentifizierungsschritte sind die gleichen, als ob sudo beteiligt wäre.

Um eine Verbindung zu einem Server als Root herzustellen, definieren Sie einen Alias ~/.ssh/configwie folgt:

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

Wenn Sie auf der Verwendung bestehen sudo, benötigen Sie meines Erachtens separate Befehle, da das sudoLesen von einem Terminal (auch wenn es ein Ticket für Ihr Konto enthält) ¹ und keine der üblichen Dateikopiermethoden (scp, sftp, rsync) erforderlich ist. Unterstützung der Interaktion mit einem Remote-Terminal.

Wenn Sie sich an ssh und sudo halten, könnten Ihre vorgeschlagenen Befehle vereinfacht werden. Wenn Sie sudo so eingerichtet haben, dass kein Kennwort mehr abgefragt wird, können Sie es einmal ausführen, um die Kennwortanforderung zu umgehen, und ein weiteres 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 du hast NOPASSWD, aber dann würdest du das nicht fragen.

Gilles 'SO - hör auf böse zu sein'
quelle
Die erste Lösung hat für mich gut funktioniert, aber die zweite sollte es sein Match host localhost.
Cduck
4

Sie können festlegen, dass sudoauf folgende Weise kein Kennwort abgefragt wird:

An der Quelle:

user    ALL=NOPASSWD:/bin/cat

Am Ziel:

user    ALL=NOPASSWD:/usr/bin/tee

Und mach auf deiner Maschine:

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

Aber ich empfehle so etwas wie eine Marionette . Es ist viel besser und einfacher, Ihr Problem mit der Verteilung von Konfigurationsdateien zu lösen.

PS. Wenn Sie den sudoBenutzer nach dem Kennwort fragen, wird die Zeichenfolge mit [sudo] password for userin der Zieldatei angezeigt.

eilen
quelle
+1 für den Vorschlag einer Marionette, aber Ihre Lösung scheint unsicher zu sein. Ich könnte genauso gut zulassen, dass ich mich als root anmelde.
itsadok
2

Anstelle von ssh können Sie scp verwenden, um die Datei zwischen den Servern zu übertragen.

Melden Sie sich beim Zielserver an:

Wechseln Sie in das Zielverzeichnis, in das Sie die Datei kopieren möchten.

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

r - rekursiv p - Behält die Änderungszeiten, Zugriffszeiten und Modi der Originaldatei bei

Mughil
quelle
Dies setzt voraus, dass ich mich als root anmelden kann, was ich nicht kann. Aktualisieren der Frage.
itsadok
2

Ohne die ssh-Konfiguration zu ändern, können Sie über die ssh-Verbindung zu server2 zwei ssh-Tunnel host-> server1 und server2-> host erstellen. Verbinden Sie diese beiden Tunnel auf dem Host-Computer (gleicher Port). Führen Sie sudo auf Server2 aus, um Daten aus verbundenen Tunneln auf Server1 abzurufen und auf Server2 zu speichern.

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 -"'

Die Idee ist: 1- einen lokalen Tunnel von Ihrem Computer zum Quellcomputer auf Port 60000 zu erstellen

ssh -L60000:${source}:22

1b - Erstellen Sie einen Remote-Tunnel, um zu Ihrer Maschine zurückzukehren

-R60000:localhost:60000

2- Stellen Sie eine Verbindung zum Zielcomputer her

-t ${target}

3- Führen Sie alle als root auf dem Zielcomputer zum Schreiben aus

'sudo bash -c "..."'

4- Stellen Sie über den Tunnel eine Verbindung zur Quellmaschine her. whoami und on localhost bedeuten den localhost auf dem $ {target} Rechner.

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

5- Packen Sie die Remote-Datei (en) und senden Sie sie komprimiert an stdout

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

6- Empfangen Sie das Paket über stdout und extrahieren Sie die Dateien entsprechend im Verzeichnis / path / to / target

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

Hinweis: Sie können bis zu 3 Bestätigungen und 3 Passwortanfragen erhalten. Dateien werden jedoch kopiert.

Marco Aurelio
quelle