Usuario del software
2012-02-29 15:44:22 +0000 2012-02-29 15:44:22 +0000
60

scp no funciona pero ssh sí

Si quiero enviar algo vía scp al servidor:

$ scp file server:
                   __________  _____
$

, entonces se imprimen tres líneas y el archivo no se copia. Sin embargo puedo conectarme al servidor vía ssh sin problema:

$ ssh server

¿Cómo hacer que scp funcione?

Respuestas [6]

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

Una posible causa de este tipo de comportamiento es tener cualquier mensaje impreso durante el proceso de inicio de sesión en el servidor. Scp depende de ssh para proporcionar un túnel encriptado totalmente transparente entre el cliente y el servidor.

Compruebe todos los scripts de inicio de sesión en el servidor, y también intente utilizar un usuario diferente. Otro método para identificar el origen del error es usar la -v en el comando, para rastrear el progreso de la transacción, y ver dónde falla. Puede utilizar hasta -vvv para aumentar la verbosidad, si es necesario. Comprobar las distintas formas de scp también puede ser instructivo, como se indica en el post de InChargeOfIT.

scp, bajo el capó, establece un túnel usando ssh, y luego transfiere el archivo a través de ese túnel, con un comando ssh en el otro extremo para capturar el archivo a medida que llega. Esto se ilustra con el uso de tar y ssh para copiar una estructura de directorios preservando la propiedad y los tiempos de creación con los siguientes comandos:

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

para enviarlo, y

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

para recuperarlo.

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

Compruebe el archivo .bashrc del usuario de destino o su equivalente. El archivo ~/.bashrc se utiliza para los inicios de sesión no interactivos. Si hay un eco o un comando que emita algo, romperá el protocolo SCP.

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

Edición: ¿Está seguro de que está introduciendo una ruta válida en el comando scp? Por ejemplo:

scp test.txt username@remoteserver.com

fallará (de hecho, sólo imprimirá el comando como estás viendo). En este caso, tendrá que proporcionar una ruta válida al servidor remoto.. por ejemplo, scp test.txt username@remoteserver.com:~/

Ejemplos de uso:

Enviar un archivo:

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

Obtener un archivo:

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

Ejemplos:

Enviar un archivo desde mi Escritorio a mi carpeta de inicio en un servidor remoto:

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

Recuerde que el ~ es un acceso directo a su directorio personal... por ejemplo, /home/

Enviar un archivo al webroot:

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

En este ejemplo, el usuario john_doe necesitaría privilegios de escritura en el directorio remoto /var/www.

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

En algunos hosts se originan incorrectamente .bash_profile para inicios de sesión no interactivos como scp. Los mensajes que se imprimen en la terminal pueden hacer que scp no funcione correctamente. Si tienes mensajes en tu .bash_profile esta puede ser la causa.

Para que sus mensajes de inicio de sesión, banner, etc. se muestren en los inicios de sesión interactivos y aún así poder usar scp a través de un inicio de sesión no interactivo, añada lo siguiente antes de cualquier mensaje que se imprima en su archivo .bash_profile.

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

[-z "$PS1"] && return

El código alternativo es:

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

Y otro código alternativo:

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

Que creo que es la versión más larga del primer código alternativo. He comprobado que en algunos hosts el primer código no funciona correctamente pero el segundo sí.

Durante un inicio de sesión scp no interactivo abortará la ejecución de .bash_profile y permitirá que el scp funcione, pero mostrará sus mensajes de inicio de sesión cuando se inicie por ssh.

Nota: Esto también puede ser usado en su archivo .bashrc si lo origina desde .bash_profile (para $PATH) de manera que sólo parte de él sea originado durante los inicios de sesión no interactivos.

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

Estaba llamando a exec /bin/bash en .cshrc.

Eliminando esto se me solucionó el problema.

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

Esto no responde a la pregunta directamente, pero podría ser útil para gente como yo, que busca una solución con un scp que se congela cuando se transfieren archivos entre 2 hosts remotos.

Si scp se cuelga debido a los mensajes de ssh, podría ayudar a suprimirlos:

scp -o "StrictHostKeyChecking no"

y / o

scp -B

Del manual de scp:

-B Selecciona el modo por lotes (evita pedir contraseñas o frases de paso).

-o ssh_option Se puede utilizar para pasar opciones a ssh en el formato utilizado en no hay bandera de línea de comandos scp por separado. Para obtener todos los detalles de las opciones enumeradas a continuación, y sus posibles valores, consulte ssh_config(5).

En mi caso eso pareció ayudar, pero no resolvió todo el problema. No pudimos averiguar por qué scp se cuelga cuando se transfiere de remoto a remoto. Se colgaba en la mitad del archivo. 9 veces funcionó, el intento número 10 no. Sospechamos que podría ser que se cuelga cuando nuestra conexión VPN tiene un pico de tráfico por un momento y luego scp no se recupera. Realmente se cuelga para siempre y ni siquiera da un mensaje de error.

Sin embargo, me rendí y cambié a sftp. Esto es razonablemente más rápido, ya que utiliza una conexión directa entre los hosts remotos. Sin embargo, tienes que habilitar

Host example.com
    AgentForward yes

en el archivo ~/.shh/config de la máquina que está ejecutando el script. Por supuesto, esto sólo es una solución si las máquinas remotas están dentro de su red de confianza.

0