hacer que scp se comporte como debería (progtwig de copy de file remoto)

Quiero copyr el file local a un server remoto usando scp .

 scp -rp local-file my.server.com:/tmp/ 

A veces me olvido de especificar en qué parte del server remoto se debe copyr el file:

 scp -rp local-file my.server.com 

o, otras veces, escribo mal : por un ; :

 scp -rp local-file my.server.com;/tmp/ 

en ambos casos, scp debería fallar. Pero, en cambio, se comporta completamente idiotamente, y copy el file local localmente, como lo haría cp .

 cp local-file my.server.com 

Incluso el man scp dice que scp es remote file copy program . Entonces, ¿por qué está fallando silenciosamente y comportándose como cp ?

Cualquier forma de arreglar esto ?

Mi versión de openssh-client es 1:6.0p1-4+deb7u6

En bash, podrías escribir una function de envoltura como esta.

 function scp { if grep -q ':[^ $]' <<< "$*" ; then command "${FUNCNAME[0]}" "$@" else echo "missing or invalid hostname:path in scp command" return 1 fi } 

Este es un ejemplo muy crudo, todo lo que hace es verificar que haya un : seguido de al less un carácter no espacial en la línea de command (eso es suficiente para un ejemplo de testing de concepto, pero inadecuado para el uso en el mundo real) . Si existe, ejecuta el command scp . Si no, imprime un post de error y regresa con el código de salida 1.

O podrías escribirlo como un guión, no importa mucho.

Por cierto, dije "In bash" arriba, eso es porque solo he probado la function anterior en bash. No significa que solo bash puede hacer esto. La mayoría de las otras implementaciones sh le permiten hacer lo mismo o similar. La syntax puede variar ligeramente, y es posible que tenga que codificar el command scp ... lugar del command "${FUNCNAME[0]} ..." más genérico command "${FUNCNAME[0]} ..." .

PD: No hago ningún juicio sobre si scp "debería" comportarse así o no. Eso es para que usted decida sobre su propio sistema. Sin embargo, volverse dependiente de este tipo de cosas te pone en una grave desventaja cuando tienes que trabajar en el sistema sin todos tus hacks / muletas personalizadas.

respuesta corta es que no puedes.

tenga en count que man scp menciona el host remoto como opcional:

scp (opciones scp eliminadas) [[usuario @] host1:] file1 … [[usuario @] host2:] file2

ahora, cuando emite el command

 scp arg1 arg2 

scp decidirá dónde está el host remoto buscando : en arg1 o arg2 (y se pueden permitir dos hosts remotos (solaris, ubuntu) aunque ese no fue siempre el caso).

Si ni arg1 , ni arg2 tienen dos puntos, scp simplemente se comporta como cp .

Además de otras respuestas, tenga en count que scp no es un protocolo separado per se , sino que simplemente es el rcp anterior que usa ssh para el transporte en lugar de TCP no encryption. Fue pensado como un reemploop directo donde cualquier rcp con guiones o sin guiones podría ser reemplazado por un scp más seguro sin ningún cambio. Y rcp permitió la copy remota o local al analizar el :

¿Por qué no probar sftp ? Puede hacer un cd en el server remoto y lcd en el sistema de files local, y luego put para download un file local a remoto.

Aunque se llama progtwig de copy remota de files, creo que está diseñado para poder cumplir con las necesidades locales de copydo junto con las necesidades remotas. Este comportamiento se reflejó en mi entorno al realizar testings.

También vale la pena señalar que al recuperar el valor de la variable de entorno $? después de ejecutarlo localmente, se observó un código de retorno de 0. Esto indica que se comportó como se esperaba y no arrojó un código de error.

No estoy seguro de que exista una manera de evitar este comportamiento pnetworkingeterminado por desgracia. Usar otra herramienta puede ser la única otra opción.