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?

Neil
quelle
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
Johan
quelle
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
MasterCheffinator
quelle
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.

bläulich
quelle
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
DaniloNC
quelle
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.

Jan Tojnar
quelle
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

Mike Tyson
quelle
-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

Kumar
quelle
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