scp funktioniert nicht aber ssh


56

Wenn ich etwas per scp an den Server senden möchte:

$ scp file server:
                   _____  _____  _____
$

Dann werden drei Zeilen gedruckt und die Datei wird nicht kopiert. Ich kann mich jedoch problemlos über ssh mit dem Server verbinden:

$ ssh server

Wie kann man scp zum Laufen bringen?


Geben Sie weitere Informationen wie das Betriebssystem, die SSH-Konfigurationsdatei usw. an.
qroberts

Und welche drei Zeilen werden gedruckt?
JJLIN

Im Normalfall wird scp file server:die Datei beim Ausführen (vorausgesetzt, "Server" ist ein gültiger Hostname) in Ihr Kontoverzeichnis kopiert.
Dan_linder

3
Können Sie die Ausgabe bereitstellen, wenn Sie "scp -v file server:" ausführen?
Dan_linder

Sie könnten versuchen scp, einen anderen Ort auf dem Server, dann eine cpoder mvnachssh
Jesse W. Collins

Antworten:


68

Eine mögliche Ursache für diese Art von Verhalten ist der Ausdruck einer Nachricht während des Anmeldevorgangs auf dem Server. Scp ist auf ssh angewiesen, um einen vollständig transparenten, verschlüsselten Tunnel zwischen dem Client und dem Server bereitzustellen.

Überprüfen Sie alle Anmeldeskripts auf dem Server und versuchen Sie, einen anderen Benutzer zu verwenden. Eine andere Methode zum Ermitteln der Fehlerquelle besteht darin, das -v im Befehl zu verwenden, um den Fortschritt der Transaktion zu verfolgen und festzustellen, wo der Fehler auftritt. Bei Bedarf können Sie die Ausführlichkeit mit bis zu -vvv erhöhen. Das Überprüfen der verschiedenen Formen von scp kann auch aufschlussreich sein, wie in dem Beitrag von InChargeOfIT aufgeführt.

scp baut unter der Haube einen Tunnel mit ssh auf und überträgt die Datei dann über diesen Tunnel mit einem ssh-Befehl am anderen Ende, um die Datei zu fangen, sobald sie ankommt. Dies wird durch die Verwendung von tar und ssh zum Kopieren einer Verzeichnisstruktur unter Beibehaltung der Besitz- und Erstellungszeiten mit den folgenden Befehlen veranschaulicht:

  tar czf - ./* | ssh jf@otherserver.com tar xzf - -C ~/saved_tree

um es zu senden, und

ssh jf@otherserver.com "tar czf - ~/saved_tree" | tar xzvf - -C ./

um es zurückzubekommen.


Es ist wirklich hilfreich
Ahorn

Kann man scp in .bashrc erkennen? Damit Sie die Ausgabe überprüfen und nur dann drucken können, wenn es sich bei der Shell nicht um eine SCP-Ausgabe handelt?
Alexandros

Der Benutzer muss außerdem über die Berechtigungsstufe 15 verfügen. Wenn der Benutzer nicht über die Berechtigungsstufe 15 verfügt, beendet der ASA die Verbindung nach der Authentifizierung ohne Fehlermeldung, die auf ein Berechtigungsproblem hinweist. Nur weil Ihr Benutzer enableein Passwort eingeben und eingeben kann, heißt das nicht, dass er Privileg 15 ist. Wenn Sie nicht irgendwo in "Privileg 15" sehen show run | inc USERNAME, können sie scp nicht ausführen.
Tyler Abair

Ich habe im Grunde genommen "zsh" von meinem .bashrc auf dem entfernten Server entfernt und scp hat angefangen zu arbeiten!
Geek

Es wird auch unterbrochen, wenn Sie die Variable SHELL (zB export SHELL=/bin/zsh) in ändern ~/.bashrc. Dies wird manchmal in Abwesenheit von verwendet chsh.
Suuuehgi

57

Überprüfen Sie die .bashrc-Datei oder eine entsprechende Datei des Zielbenutzers. ~ / .bashrc wird für nicht interaktive Anmeldungen verwendet. Wenn es ein Echo oder einen Befehl gibt, der etwas ausgibt, wird das SCP-Protokoll verletzt.


10
EUREKA! Dies war mein Problem, weil ich ein Vermögen hatte cowsay bei jedem Login in meiner entfernten .bashrc. Jetzt funktioniert es perfekt.
Thomas Browne

3
Sie Sir, sind ein Lebensretter. :)
Gaurav Manchanda

4
Wenn Sie immer noch wollen fortune | cowsay, legen Sie es einfach in .bash_profile. Dies ist nur für interaktive Anmeldungen gedacht und sollte nicht während der SCP-Sitzung verwendet werden.
Spoulson

Mein Problem war, dass ich eine andere Datei in meiner beschafft habe .bashrc, die auf der anderen Maschine nicht existieren würde. Sie können die Logik in dieser Antwort verwenden , um zu überspringen, ~/.bashrcwenn Sie nicht interaktiv sind (was der Fall ist scp).
wisbucky

15

Bearbeiten: Sind Sie sicher, dass Sie im Befehl scp einen gültigen Pfad eingeben? Zum Beispiel:

scp test.txt username@remoteserver.com

wird fehlschlagen (in der Tat wird es nur den Befehl ausdrucken, wie Sie sehen). In diesem Fall müssen Sie einen gültigen Pfad zum Remote-Server angeben.scp test.txt username@remoteserver.com:~/

Beispielverwendungen:

Sende eine Datei:

scp /path/to/local/file yourremoteusername@servername.com:/path/to/remote/directory

Holen Sie sich eine Datei:

scp yourremoteusername@servername.com:/path/to/remote/file /path/to/local/directory

Beispiele:

Senden Sie eine Datei von meinem Desktop an meinen privaten Ordner auf einem Remote-Server:

scp ~/Desktop/myfile.txt john_doe@10.1.1.10:~/

Denken Sie daran, das ~ist eine Verknüpfung für Ihr Home-Verzeichnis ... zB / home /

Senden Sie eine Datei an die Webroot:

scp ~/Documents/working/index.html john_doe@johndoe.com:/var/www/index.html

In diesem Beispiel benötigt der Benutzer john_doe Schreibrechte für das ferne Verzeichnis / var / www.


2
Sie beantworten die Frage nicht. Die Kommandozeile von OP sieht ganz ok aus, der interessante Teil sind die ------... keines Ihrer Beispiele bezieht sich darauf.
Akira

@akira vielleicht, vielleicht auch nicht. Wenn keine gültigen Pfade angegeben werden, schlägt der Befehl scp fehl. Wenn Sie beispielsweise scp somefile user@host.com:nicht über die richtigen Berechtigungen für das Remote-Verzeichnis verfügen, treten ebenfalls Probleme auf. Bearbeitet meine Antwort, um es ein wenig klarer zu machen
InChargeOfIT

1
Keines Ihrer Beispiele deckt "Datei existiert nicht" ab, keines Ihrer Beispiele deckt "Berechtigungen auf Serverseite falsch" ab ...
akira

4

Auf einigen Hosts wird fälschlicherweise .bash_profilenach nicht interaktiven Anmeldungen wie scp gesucht. Meldungen, die an das Terminal gesendet werden, können möglicherweise dazu führen scp, dass sie nicht richtig funktionieren. Wenn Sie Nachrichten in Ihrem .bash_profilehaben, kann dies die Ursache sein.

Damit Ihre Anmeldemeldungen, Banner usw. weiterhin in interaktiven Anmeldungen angezeigt werden und weiterhin scpüber eine nicht interaktive Anmeldung verwendet werden können, fügen Sie vor jeder Meldung, die in Ihrer .bash_profileDatei ausgedruckt wird, Folgendes hinzu .

# ********** If not running interactively, don't do anything more! ***********

[ -z "$PS1" ] && return

Alternativer Code ist:

[[ $- == *i* ]] || return

Und noch ein alternativer Code:

case $- in
    *i*) ;;
      *) return;;
esac

Was ich glaube, ist die längere Version des ersten alternativen Codes. Ich habe festgestellt, dass auf einigen Hosts der erste Code nicht richtig funktioniert, der zweite jedoch.

Während einer nicht interaktiven scp-Anmeldung wird die weitere Ausführung von .bash_profile abgebrochen und ermöglicht, dass scp funktioniert. Ihre Anmeldemeldungen werden jedoch angezeigt, wenn Sie sich über ssh anmelden.

Hinweis: Dies kann auch in Ihrer .bashrcDatei verwendet werden, wenn Sie sie aus .bash_profile(für $ PATH) beziehen, sodass bei nicht interaktiven Anmeldungen nur ein Teil davon bezogen wird.


Danke funktioniert wie ein Zauber ........
Etwas

0

Dies beantwortet die Frage nicht direkt, kann aber für Leute wie mich hilfreich sein, die nach einer Lösung mit einem einfrierenden scp suchen, wenn sie Dateien zwischen zwei Remote-Hosts übertragen.

Wenn sich scpssh aufgrund von Nachrichten aufhängt, kann dies dazu führen, dass sie unterdrückt werden:

scp -o "StrictHostKeyChecking no"

und / oder

scp -B

Vom scp Mann:

-B Wählt den Batch-Modus aus (verhindert die Abfrage von Passwörtern oder Passphrasen).

-o ssh_option Kann verwendet werden, um Optionen in dem Format an ssh zu übergeben, in dem es kein separates scp-Befehlszeilenflag gibt. Ausführliche Informationen zu den unten aufgeführten Optionen und ihren möglichen Werten finden Sie unter ssh_config (5).

In meinem Fall schien das zu helfen, hat aber nicht das ganze Problem gelöst. Wir konnten nicht herausfinden, warum scp bei der Übertragung von Remote zu Remote hängen bleibt. Es hing in der Mitte der Akte. 9 Mal hat es funktioniert, Versuch Nummer 10 nicht. Wir vermuteten, dass es sein könnte, dass es hängt, wenn unsere VPN-Verbindung für einen Moment eine Verkehrsspitze bekommt und scp sich dann nicht erholt. Es hängt wirklich nur für immer und gibt nicht einmal eine Fehlermeldung.

Allerdings habe ich aufgegeben und auf sftp umgestellt. Dies ist einigermaßen schneller, da eine direkte Verbindung zwischen den Remotehosts verwendet wird. Sie müssen aktivieren

Host example.com
    AgentForward yes

in der ~ / .shh / config-Datei des Rechners, auf dem das Skript ausgeführt wird. Dies ist natürlich nur eine Lösung, wenn sich beide Remote-Computer in Ihrem vertrauenswürdigen Netzwerk befinden.


0

Ich rufe exec /bin/bashin .cshrc.

Das Entfernen löste das Problem für mich.

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.