SCP ne fonctionne pas, mais SSH fait


57

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?


Fournir plus d'informations telles que le système d'exploitation, le fichier de configuration ssh, etc.
qroberts

Et quelles sont ces trois lignes qui sont imprimées?
jjlin

Normalement, lorsque vous exécutez scp file server:(en supposant que "serveur" est un nom d'hôte valide), le fichier est copié dans votre répertoire de compte.
dan_linder

3
Pouvez-vous fournir le résultat lorsque vous exécutez "serveur de fichiers scp -v:".
dan_linder

Vous pouvez essayer scpun emplacement différent sur le serveur, puis un cpou mvaprèsssh
Jesse W. Collins

Réponses:


68

Une cause possible de ce type de comportement est l’ impression d’ un message pendant le processus de connexion sur le serveur. Scp dépend de ssh pour fournir un tunnel crypté 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. Contrôler les 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 arrive. 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 jf@otherserver.com tar xzf - -C ~/saved_tree

pour l'envoyer, et

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

pour le récupérer.


C'est vraiment utile
érable

Est-il possible de détecter scp dans .bashrc? Pour que vous puissiez vérifier et imprimer uniquement lorsque le shell n’est pas un scp?
Alexandros

L'utilisateur doit également avoir le niveau de privilège 15. Si l'utilisateur n'a pas le niveau de privilège 15, l'ASA fermera simplement la connexion après l'authentification sans message d'erreur indiquant un problème de privilège. De plus, ce n'est pas parce que vos utilisateurs peuvent taper enableet entrer un mot de passe qu'ils sont privés 15. Si vous ne voyez pas le "privilège 15" quelque part, show run | inc USERNAMEils ne pourront pas scp.
Tyler Abair

En gros, j'ai supprimé "zsh" de mon .bashrc sur le serveur distant et scp a commencé à fonctionner!
Geek

Il se brise également si vous modifiez la variable SHELL (par exemple export SHELL=/bin/zsh) dans ~/.bashrc. Ceci est parfois utilisé en l'absence de chsh.
Suuuehgi

58

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


10
EUREKA! C'était mon problème parce que j'avais une fortune | Cowsay sur chaque connexion dans mon .bashrc à distance. Maintenant, fonctionne parfaitement.
Thomas Browne

3
Vous êtes une bouée de sauvetage, monsieur. :)
Gaurav Manchanda

4
Si vous le souhaitez toujours fortune | cowsay, insérez-le simplement dans .bash_profile. Cela concerne uniquement les connexions interactives et ne doit pas être généré pendant la session SCP.
Spoulson

Mon problème était que je recherchais un autre fichier dans mon ordinateur .bashrc, qui n'existerait pas sur l'autre machine. Vous pouvez utiliser la logique de cette réponse pour ignorer les situations ~/.bashrcnon interactives (ce qui est le cas scp).
Wisbucky le

15

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

scp test.txt username@remoteserver.com

é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. Par exemple,scp test.txt username@remoteserver.com:~/

Exemples d'utilisation:

Envoyer un fichier:

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

Obtenir un fichier:

scp yourremoteusername@servername.com:/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 john_doe@10.1.1.10:~/

N'oubliez pas qu'il ~s'agit d'un raccourci pour votre répertoire personnel ... par exemple, / home /

Envoyer un fichier à la racine Web:

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

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


2
vous ne répondez pas à la question. la ligne de commande donnée par OP semble assez correcte, la partie intéressante est la ------... aucun de vos exemples ne se rapporte à cela.
Akira

@akira peut-être, peut-être pas. Si vous ne fournissez pas de chemins valides, la commande scp échouera. Par exemple scp somefile user@host.com:, le fait de ne pas disposer des autorisations appropriées sur le répertoire distant poserait également des problèmes. Edité ma réponse pour le rendre un peu plus clair
InChargeOfIT

1
aucun de vos exemples ne couvre "le fichier n'existe pas", aucun de vos exemples ne couvre "des autorisations erronées côté serveur" ...
akira

4

Sur certains hôtes, ils ne fournissent pas correctement .bash_profiledes noms de connexion non interactifs comme scp. Les messages imprimés sur le terminal peuvent éventuellement entraîner un scpdysfonctionnement. Si vous avez des messages dans votre .bash_profilecela 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 les utiliser scpvia un nom de connexion non interactif, ajoutez ce qui suit avant tout message pouvant être imprimé dans votre .bash_profilefichier.

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

[ -z "$PS1" ] && return

Le code alternatif est:

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

Et un autre code alternatif:

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

Ce qui, je crois, est la version la plus longue du premier code alternatif. J'ai trouvé sur certains hôtes que le premier code ne fonctionne pas correctement mais que le second fonctionne.

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 .bashrcfichier si vous le sourcez .bash_profile(pour $ PATH) afin que seule une partie de celui-ci soit obtenue lors de connexions non interactives.


grâce fonctionne comme un charme ........
somethingSomething

0

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 se scpbloque à 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 pouvait se bloquer lorsque notre connexion VPN subissait 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

Je l'appelais exec /bin/bashdans .cshrc.

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.