scp no funciona pero ssh sí


57

Si quiero enviar algo a través de scp al servidor:

$ scp file server:
                   _____  _____  _____
$

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

$ ssh server

¿Cómo hacer que scp funcione?


Proporcione más información como el sistema operativo, el archivo de configuración ssh, etc.
qroberts

¿Y cuáles son estas tres líneas que se imprimen?
jjlin

En el caso normal, cuando ejecuta scp file server:(suponiendo que "servidor" es un nombre de host válido), el archivo se copia en el directorio de su cuenta.
dan_linder

3
¿Puede proporcionar el resultado cuando ejecuta "scp -v file server:".
dan_linder

Puede intentar scpuna ubicación diferente en el servidor, luego una cpo mvdespuésssh
Jesse W. Collins

Respuestas:


68

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

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

scp, debajo del capó, configura 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 se acerca. Esto se ilustra mediante el uso de tar y ssh para copiar una estructura de directorio que preserva los tiempos de propiedad y 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


Es realmente útil
arce

¿Es posible detectar scp dentro de .bashrc? ¿Para que pueda verificar y solo imprimir la salida cuando el shell no es un scp?
Alexandros

El usuario también debe tener el nivel de privilegio 15. Si el usuario no tiene el nivel de privilegio 15, el ASA simplemente cerrará la conexión después de la autenticación sin ningún mensaje de error que indique un problema de privilegio. Además, el hecho de que su usuario pueda escribir enablee ingresar una contraseña no significa que sean priv 15. Si no ve el "privilegio 15" en algún lugar show run | inc USERNAME, no podrá scp.
Tyler Abair

¡Básicamente eliminé "zsh" de mi .bashrc en el servidor remoto y scp comenzó a funcionar!
Geek

También se rompe si altera la variable SHELL (por ejemplo export SHELL=/bin/zsh) en ~/.bashrc. Esto a veces se usa en ausencia de chsh.
Suuuehgi el

58

Verifique el archivo .bashrc del usuario objetivo o un archivo equivalente. ~ / .bashrc se obtiene para inicios de sesión no interactivos. Si hay un eco o comando que genera algo, romperá el protocolo SCP.


10
EUREKA! Este era mi problema porque tenía una fortuna | cowsay en cada inicio de sesión en mi .bashrc remoto. Ahora funciona perfectamente.
Thomas Browne

3
Usted señor, es un salvavidas. :)
Gaurav Manchanda

44
Si aún desea su fortune | cowsay, simplemente póngalo en .bash_profile. Eso es solo para inicios de sesión interactivos y no debe obtenerse durante la sesión de SCP.
spoulson

Mi problema era que estaba buscando otro archivo en mi .bashrc, que no existiría en la otra máquina. Puede usar la lógica en esta respuesta para omitir ~/.bashrccuando no sea interactivo (como es el caso scp).
wisbucky

15

Editar: ¿Está seguro de que está ingresando en una ruta válida en el comando scp? Por ejemplo:

scp test.txt username@remoteserver.com

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

Usos de ejemplo:

Enviar un archivo:

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

Obtén 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 ~es un acceso directo para su directorio de inicio ... por ejemplo, / home /

Envíe un archivo a la raíz web:

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.


2
No estás respondiendo la pregunta. la línea de comando dada por OP se ve bastante bien, la parte interesante es ------... ninguno de sus ejemplos se relaciona con eso.
akira

@akira tal vez, tal vez no. Si no se proporcionan rutas válidas, el comando scp fallará. Por ejemplo scp somefile user@host.com:, no tener los permisos correctos en el directorio remoto también podría causar problemas. Edité mi respuesta para hacerlo un poco más claro
InChargeOfIT

1
ninguno de sus ejemplos cubrir "archivo no existe", ninguno de los ejemplos cubrir "permisos mal en el lado del servidor" ...
Akira

4

En algunos hosts, obtienen de forma incorrecta .bash_profileinicios de sesión no interactivos como scp. Los mensajes que se imprimen en el terminal pueden hacer scpque no funcione correctamente. Si tiene mensajes en su, .bash_profileesta puede ser la causa.

Para que sus mensajes de inicio de sesión, pancarta, etc. se muestren en inicios de sesión interactivos y pueda seguir utilizando scpun inicio de sesión no interactivo, agregue lo siguiente antes de cualquier mensaje que se imprima en su .bash_profilearchivo.

# ********** 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

Lo que creo es la versión más larga del primer código alternativo. En algunos hosts he encontrado que el primer código no funciona correctamente pero el segundo sí.

Durante un inicio de sesión scp no interactivo, abortará la ejecución posterior de .bash_profile y permitirá que scp funcione, pero mostrará sus mensajes de inicio de sesión cuando inicie sesión a través de ssh.

Nota: Esto también se puede usar en su .bashrcarchivo si lo .bash_profileobtiene (por $ PATH), de modo que solo una parte se obtiene durante inicios de sesión no interactivos.


gracias funciona como un encanto ........
algo Algo

0

Esto no responde la pregunta directamente, pero podría ser útil para personas como yo, que buscan una solución con un scp congelador al transferir archivos entre 2 hosts remotos.

Si se scpbloquea debido a mensajes de ssh, podría ayudar a eliminarlos:

scp -o "StrictHostKeyChecking no"

y / o

scp -B

Del hombre scp:

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

-o ssh_option Se puede usar para pasar opciones a ssh en el formato utilizado en que no hay un indicador de línea de comando scp separado. Para obtener detalles completos 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 descubrir por qué se bloquea scp cuando se transfiere de remoto a remoto. Colgaba en el medio del archivo. 9 veces funcionó, el intento número 10 no funcionó. Sospechamos que podría bloquearse cuando nuestra conexión VPN recibe 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 di por vencido y cambié a sftp. Esto es razonablemente más rápido, ya que utiliza una conexión directa entre los hosts remotos. Tienes que habilitar

Host example.com
    AgentForward yes

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


0

Estaba llamando exec /bin/bashen .cshrc.

Eliminar esto resolvió el problema para mí.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.