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?

scdmb
la source
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 [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.

faitjx
la source
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é.

Spoulson
la source
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 [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. Par 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]:~/

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 [email protected]:/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.

InChargeOfIT
la source
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 [email protected]:, 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.

frederickjh
la source
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.

anarchiste912
la source
0

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

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

trempettes
la source