scp zum Remote-Server mit sudo


65

Ich habe eine Datei auf Server A (die hinter einem NAT also nicht direkt ansprechbar ist). Die Datei muss in einem auf root beschränkten Verzeichnis auf Server B kopiert werden. Ich habe ein Konto auf Server B mit Sudo-Berechtigungen. Wie lautet die Syntax für den Befehl scp?



Ich habe die ältere Frage als Duplikat dieser Frage geschlossen, da der Fragesteller nie wieder den Besitz dieser Frage erlangt hat.
— Quack Quijote

Ich habe auf einen anderen Beitrag geantwortet , wie Sie scp do the sudo direkt für Sie anpassen können. Dies ist ähnlich wie bei WinSCP.
— YoYo

Antworten:


58

Zuerst müssen Sie die Datei an einen Ort kopieren, an dem Sie Schreibzugriff ohne sudo haben.

scp yourfile serverb:

Verschieben Sie dann die Datei mit sudo

ssh serverb sudo mv yourfile /path/to/the/destination

Wenn Sie keinen beschreibbaren Ort haben, erstellen Sie ein temporäres Verzeichnis mit Schreibberechtigung für Ihren Benutzer.

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination

7
/ tmp ist ein guter Ort, um temporäre Dateien zu schreiben, auf die (normalerweise) alle Benutzer Zugriff haben.
— Doug Harris

3
@Doug: Beachten Sie, dass sich / tmp möglicherweise im Arbeitsspeicher oder in / mount point befindet und nicht unbedingt groß genug ist, um große Dateien zu hosten.
— Ravachol

2
Was immer Sie erreichen wollen, chmod 777ist normalerweise der falsche Weg. Überlegen Sie, was passieren könnte, wenn jemand anderes angemeldet wäre und wüsste, dass Sie diesen Code ausführen würden.
— Tripleee

1
ssh sudofunktioniert bei mir nicht - beschwert sich "keine tty vorhanden und kein askpass programm angegeben"?
— Ross Presser

1
@ RossPresser Entschuldigung für die verspätete Antwort, aber Sie müssen entweder Sudo ohne Passwort einrichten serverboder ssh serverbseparat starten, sudo ...nachdem Sie sich angemeldet haben.
— Johan

49

Mit SCP müssen Sie zwei Schritte ausführen. Mit rsync ist dies jedoch in einem Schritt wie folgt möglich:

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

Hinweis: Dies erfordert eine NOPASSWDSudo-Konfiguration. Wenn Sie das Passwort für sudo eingeben müssen, ist der zweistufige Weg erforderlich.

Um das Verzeichnis zu kopieren, müssen Sie -rParameter hinzufügen . Und -vfür die ausführliche Ausgabe.


Um die obige Methode mit Anmeldeinformationen zu verwenden, müssen Sie diese in Ihre ~/.ssh/configDatei einfügen, z

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem

5
Dies ist bei weitem der einfachste Weg, dies zu tun.
— Matt White

Fehler sudo: sorry, you must have a tty to run sudobehoben von -e "ssh -tt".
— 3.

@ mj41 Mit -e "ssh -tt"bekomme ich protocol version mismatch -- is your shell clean?. Irgendwelche Tipps, wie man das behebt?
— Axt.

19

Sie können ssh und tar verwenden, um dies zu umgehen:

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

Dadurch wird zunächst Ihr sudo-Zeitstempel aktualisiert (ggf. nach einem Kennwort gefragt, für das ein tty ( ssh -t) erforderlich ist ). Anschließend wird mit sudo ein Tarball remote erstellt und lokal extrahiert.

Für "tar" unter RedHat 5 müssen die Optionen "--preserve" nach dem Befehl "xpsf -" angegeben werden.


Nur ein Hinweis: Wenn Sie bekommen tar: Invalid replacement string, -sscheint das Entfernen in der zu beheben (nicht sicher, wofür Sie die ssowieso brauchen ). Danke vielmals; das ist fantastisch.
— RecursivelyIronic

Dies müsste tty_ticketsdeaktiviert werden, richtig?
— Jacob Budin

@JacobBudin ja.
— Blueyed

4

Sie können sftp mit dem Befehl sudo verwenden, zum Beispiel:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST

Dies und die rsync-Methoden sind wahrscheinlich die direkteste Möglichkeit, dies in einem Schritt zu tun. Es ist bedauerlich, dass die SCP-Aufgabe in Ant es nicht unterstützt. Sie können festlegen, dass sftp verwendet wird, das Remote-Unterprogramm kann jedoch nicht geändert werden. Beachten Sie, dass das Unterprogramm je nach Servertyp unterschiedlich ist (Solaris kann unterschiedlich sein).
— YoYo

0

Wenn Sie jedes Mal ein Passwort für sudo eingeben müssen, können Sie es in einer Datei speichern:

echo "Enter password: "; read -s password; echo $password > password_file

und senden Sie es dann zusammen mit der Quelldatei.

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

Sie können teeanstelle von verwenden, spongewenn Sie keine weiteren Utils haben.


0

Zuerst müssen Sie die Datei an einen Ort kopieren, an dem Sie ohne sudo Schreibzugriff haben. Sie können die folgenden zwei Schritte ausführen.

Schritt 1: scp filename newserver

Schritt 2: ssh newserver sudo mv filename /path/to/the/destination

Weitere Informationen finden Sie im scp-Tutorial


-1
current server $ sudo scp username@server:source/path/filename /tmp/

Es kopiert eine bestimmte Datei von der Quelle nach / tmp / auf dem aktuellen Server


Es wird das sudo lokal ausführen, so dass Sie remote keine erhöhten Rechte haben.
— YoYo

Dies wird einfach nicht funktionieren, wie @Yoyo sagt.
— Mani

scp wird wahrscheinlich keine Verbindung herstellen, da es den Schlüssel von root liest
— Pierre-Olivier Vares
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.