2012-02-29 15:44:22 +0000 2012-02-29 15:44:22 +0000
60
60

scp funktioniert nicht, aber ssh schon

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 aber problemlos per ssh mit dem Server verbinden:

$ ssh server

Wie bringe ich scp zum Laufen?

Antworten (6)

72
72
72
2012-03-04 02:57:22 +0000

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

Überprüfen Sie alle Anmeldeskripte auf dem Server, und versuchen Sie auch, einen anderen Benutzer zu verwenden. Eine andere Methode zur Identifizierung der Fehlerquelle ist die Verwendung von -v im Befehl, um den Verlauf der Transaktion zu verfolgen und zu sehen, wo sie fehlschlägt. Sie können bis zu -vvv verwenden, um die Ausführlichkeit zu erhöhen, falls erforderlich. Das Überprüfen der verschiedenen Formen von scp kann ebenfalls aufschlussreich sein, wie im Beitrag von InChargeOfIT aufgeführt.

scp baut unter der Haube einen Tunnel mit ssh auf und überträgt dann die Datei über diesen Tunnel, mit einem ssh-Befehl am anderen Ende, um die Datei abzufangen, während sie rüberkommt. Dies wird durch die Verwendung von tar und ssh veranschaulicht, um eine Verzeichnisstruktur unter Beibehaltung der Besitzverhältnisse und Erstellungszeiten mit den folgenden Befehlen zu kopieren:

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

, um sie hinüber zu senden, und

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

, um sie zurückzubekommen.

61
61
61
2014-06-03 18:20:48 +0000

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

15
15
15
2012-02-29 17:21:01 +0000

Bearbeiten: Sind Sie sicher, dass Sie einen gültigen Pfad in den scp-Befehl 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, z. B. scp test.txt username@remoteserver.com:~/

Beispielverwendungen:

Eine Datei senden:

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

Eine Datei holen:

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

Beispiele:

Senden einer Datei von meinem Desktop zu meinem Home-Ordner auf einem Remote-Server:

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

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

Senden Sie eine Datei an das Webroot:

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

In diesem Beispiel würde der Benutzer john_doe Schreibrechte auf das entfernte Verzeichnis /var/www benötigen.

5
5
5
2018-12-02 14:21:35 +0000

Auf einigen Hosts geben sie .bash_profile für nicht interaktive Anmeldungen wie scp fälschlicherweise als Quelle an. Meldungen, die auf dem Terminal ausgegeben werden, können möglicherweise dazu führen, dass scp nicht korrekt funktioniert. Wenn Sie Meldungen in Ihrem .bash_profile haben, kann dies die Ursache sein.

Damit Ihre Anmeldemeldungen, Banner usw. auch bei interaktiven Anmeldungen angezeigt werden und Sie scp trotzdem über eine nicht-interaktive Anmeldung verwenden können, fügen Sie Folgendes vor jeder Meldung ein, die in Ihrer .bash_profile-Datei ausgedruckt werden würde.

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

[-z "$PS1"] && return

Der alternative Code ist:

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

Und ein weiterer alternativer Code:

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

, der meiner Meinung nach die längere Version des ersten alternativen Codes ist. Ich habe festgestellt, dass auf einigen Hosts der erste Code nicht korrekt funktioniert, aber der zweite schon.

Während einer nicht-interaktiven scp-Anmeldung bricht er die weitere Ausführung von .bash_profile ab und lässt scp funktionieren, zeigt aber Ihre Anmeldemeldungen an, wenn Sie sich per ssh anmelden.

Hinweis: Dies kann auch in Ihrer .bashrc-Datei verwendet werden, wenn Sie sie aus .bash_profile (für $PATH) beziehen, sodass nur ein Teil davon während nicht-interaktiver Anmeldungen bezogen wird.

0
0
0
2018-10-14 14:34:43 +0000

Ich habe exec /bin/bash in .cshrc aufgerufen.

Dies zu entfernen, löste das Problem für mich.

0
0
0
2018-10-02 14:01:50 +0000

Dies beantwortet die Frage nicht direkt, könnte aber für Leute wie mich hilfreich sein, die nach einer Lösung mit einem einfrierenden scp beim Übertragen von Dateien zwischen 2 entfernten Hosts suchen.

Wenn scp aufgrund von Meldungen von ssh hängt, könnte es helfen, diese zu unterdrücken:

scp -o "StrictHostKeyChecking no"

und / oder

scp -B

Aus dem scp man:

-B Wählt den Batch-Modus (verhindert das Abfragen von Passwörtern oder Passphrasen).

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

In meinem Fall schien das zu helfen, löste aber nicht das ganze Problem. Wir konnten nicht herausfinden, warum scp sich bei der Übertragung von Remote zu Remote aufhängt. Es blieb mitten in der Datei hängen. 9 Mal hat es funktioniert, Versuch Nummer 10 nicht. Wir vermuteten, dass es daran liegen könnte, dass es sich aufhängt, wenn unsere VPN-Verbindung für einen Moment einen Traffic-Spike bekommt und scp sich dann nicht mehr erholt. Es hängt wirklich einfach ewig und gibt nicht einmal eine Fehlermeldung aus.

Wie auch immer, ich habe aufgegeben und bin auf sftp umgestiegen. Das ist einigermaßen schneller, da es eine direkte Verbindung zwischen den entfernten Hosts verwendet. Sie müssen allerdings

Host example.com
    AgentForward yes

in der Datei ~/.shh/config des Rechners aktivieren, auf dem das Skript läuft. Natürlich ist dies nur eine Lösung, wenn sich die entfernten Rechner beide in Ihrem vertrauenswürdigen Netzwerk befinden.