web-dev-qa-db-fra.com

sCP ne fonctionne pas, mais SSH fait

Si je veux envoyer quelque chose via scp au serveur:

$ scp file server:
                   _____  _____  _____
$

, alors trois lignes sont imprimées et le fichier n’est pas copié. Cependant, je peux me connecter au serveur via ssh sans problème:

$ ssh server

Comment faire fonctionner scp?

47
scdmb

Une cause possible de ce type de comportement est le fait que le message any soit imprimé pendant le processus de connexion sur le serveur. Scp dépend de ssh pour fournir un tunnel chiffré totalement transparent entre le client et le serveur.

Vérifiez tous les scripts de connexion sur le serveur et essayez également d'utiliser un autre utilisateur. Une autre méthode d'identification de la source de l'erreur consiste à utiliser le -v dans la commande pour suivre la progression de la transaction et voir où elle a échoué. Vous pouvez utiliser jusqu'à -vvv pour augmenter la verbosité, si nécessaire. Le contrôle des différentes formes de scp peut également être instructif, comme indiqué dans le post par InChargeOfIT.

scp, sous le capot, configure un tunnel à l'aide de ssh, puis transfère le fichier sur ce tunnel, avec une commande ssh à l'extrémité distante pour intercepter le fichier à mesure qu'il passe. Ceci est illustré par l'utilisation de tar et ssh pour copier une structure de répertoire en préservant les temps de propriété et de création à l'aide des commandes suivantes:

  tar czf - ./* | ssh [email protected] tar xzf - -C ~/saved_tree

pour l'envoyer, et

ssh [email protected] "tar czf - ~/saved_tree" | tar xzvf - -C ./

pour le récupérer.

62
faitjx

Vérifiez le fichier .bashrc ou équivalent de l'utilisateur cible. ~/.bashrc a été créé pour des connexions non interactives. Si un echo ou une commande génère quelque chose, le protocole SCP sera rompu.

51
spoulson

Edit: Êtes-vous certain que vous entrez un chemin valide dans la commande scp? Par exemple:

scp test.txt [email protected]

échouera (en fait, il affichera simplement la commande telle que vous la voyez). Dans ce cas, vous devrez fournir un chemin valide au serveur distant. Exemple: scp test.txt [email protected]:~/

Exemples d'utilisation:

Envoyer un fichier:

scp /path/to/local/file [email protected]:/path/to/remote/directory

Obtenir un fichier:

scp [email protected]:/path/to/remote/file /path/to/local/directory

Exemples:

Envoyer un fichier de mon bureau à mon dossier personnel sur un serveur distant:

scp ~/Desktop/myfile.txt [email protected]:~/

Rappelez-vous que ~ est un raccourci pour votre répertoire personnel ... par exemple,/home /

Envoyer un fichier à la racine Web:

scp ~/Documents/working/index.html [email protected]:/var/www/index.html

Dans cet exemple, l'utilisateur john_doe aurait besoin de privilèges d'écriture sur le répertoire distant/var/www.

13
InChargeOfIT

Cela ne répond pas directement à la question, mais pourrait être utile pour les personnes comme moi qui recherchent une solution avec un scp gelant lors du transfert de fichiers entre 2 hôtes distants.

Si scp se bloque à cause de messages de ssh, cela pourrait aider à les surpresser:

scp -o "StrictHostKeyChecking no"

et/ou

scp -B

De l'homme SCP:

-B Sélectionne le mode de traitement par lots (empêche de demander des mots de passe ou des phrases secrètes).

-o ssh_option Peut être utilisé pour transmettre des options à ssh dans le format utilisé car il n'y a pas d'indicateur de ligne de commande scp distinct. Pour plus de détails sur les options répertoriées ci-dessous et leurs valeurs possibles, reportez-vous à la section ssh_config (5).

Dans mon cas, cela a semblé aider, mais n'a pas résolu le problème dans son ensemble. Nous ne pouvions pas savoir pourquoi scp se bloque lors du transfert de distant en distant. Il était accroché au milieu du fichier. 9 fois cela a fonctionné, la tentative numéro 10 n'a pas fonctionné. Nous soupçonnions qu'il pourrait se bloquer lorsque notre connexion VPN subit un pic de trafic pendant un moment, puis que scp ne récupère pas. Il ne tient que pour toujours et ne donne même pas un message d'erreur.

Cependant, j'ai abandonné et suis passé à sftp. Ceci est raisonnablement plus rapide, car il utilise une connexion directe entre les hôtes distants. Vous devez activer

Host example.com
    AgentForward yes

dans le fichier ~/.shh/config de la machine qui exécute le script. Bien entendu, ce n'est une solution que si les ordinateurs distants se trouvent tous les deux dans votre réseau de confiance.

0
anarchist912

Sur certains hôtes, ils ont incorrectement source .bash_profile pour des connexions non interactives telles que scp. Les messages imprimés sur le terminal peuvent éventuellement empêcher scp de fonctionner correctement. Si vous avez des messages dans votre .bash_profile, cela peut en être la cause.

Pour que vos messages de connexion, vos bannières, etc., s'affichent toujours lors de connexions interactives et que vous puissiez toujours utiliser scp via un nom de connexion non interactif, ajoutez ce qui suit avant tout message à imprimer dans votre fichier .bash_profile.

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

[ -z "$PS1" ] && return

Lors d'une connexion scp non interactive, il interrompra toute exécution ultérieure de .bash_profile et permettra à scp de fonctionner, mais affichera vos messages de connexion lorsque vous vous connecterez via ssh.

Remarque: Ceci peut également être utilisé dans votre fichier .bashrc si vous le sourcez à partir de .bash_profile (pour $ PATH), de sorte que seule une partie de celui-ci est obtenue lors de connexions non interactives.

0
frederickjh

J'appelais exec /bin/bash dans .cshrc.

Le fait de supprimer cela a résolu le problème pour moi.

0
dips