ftp admite el put "|..." "remote-file.name"
comando para canalizar datos a una conexión ftp. ¿Hay algo similar disponible para sftp?
En sftp me sale el siguiente error:
sftp 'jmw@backupsrv:/uploads'
sftp> put "| tar -cx /storage" "backup-2012-06-19--17-51.tgz"
stat | tar -cv /storage: No such file or directory
como arriba, el cliente sftp obviamente no ejecuta el comando.
Quiero usar el comando de tubería para redirigir directamente la secuencia del archivo a sftp. (porque no queda suficiente espacio para crear un archivo de copia de seguridad en el mismo disco antes de cargarlo en el servidor sftp).
Respuestas:
Me divertí mucho encontrando una solución a este problema. Requiere la herramienta nc (netcat) en ambas máquinas y SSH (no se necesita SFTP).
En este ejemplo, llamaré a la máquina que tiene los datos que necesitan respaldar linux-a, y la máquina que necesita recibir la copia de seguridad linux-b.
En linux-a, haga que netcat escuche en un puerto (tomé 2000) y rediríjalo a un archivo. Esto solo se quedará allí y esperará hasta que algo llegue a ese puerto.
En linux-b, abra un túnel ssh en linux-a, utilicé el puerto 2000 nuevamente. Esto redirigirá todo lo que arroje en el puerto TCP 2000 en localhost al puerto TCP 2000 en linux-a, donde netcat está escuchando.
Ahora cree el archivo tar, pero envíe la salida a stdout (usando -) y canalícela a gzip para obtener algo de compresión. Ahora canalice eso a otro netcat que lo envíe a localhost en TCP en el puerto 2000.
Ya hemos terminado! En linux-b, netcat ya no escucha y se crea un nuevo archivo. La mejor parte es que el archivo tar nunca se colocó en el disco duro de linux-a.
Sé que no es exactamente lo que pediste en la pregunta, pero si tienes netcat disponible, es una solución viable para tu tipo de problema.
Editar: Olvidé una cosa: si sigues estas instrucciones, todavía tendrás un túnel SSH flotando en linux-a. Descubra cuál es la ID del proceso y elimínelo.
fuente
Como este es el primer resultado que encuentras buscando en Google esta pregunta y no se ha mencionado ya, también agregaré la solución que encontré aquí:
puede usar la implementación de curls sftp para esto. Como curl probablemente ya esté instalado en muchos sistemas, esto podría preferirse a la solución que usa clientes personalizados.
ejemplo de uso:
curl
usa su.ssh/known_hosts
archivo para la verificación de clave. Esto podría fallar en caso de que su cliente ssh use estándares de cifrado más nuevos no admitidos por la biblioteca utilizada en curlPara solucionar esto, puede agregar los otros tipos de clave al archivo de hosts conocidos con el siguiente comando:
o puede deshabilitar la verificación de clave usando la
-k
bandera (aunque no lo recomendaría)fuente
output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command'
es una opción, si su usuario remoto tiene un shell válido.fuente
this
lugar". - Esto me parece una de esas veces.S
ecure al dejar entrar a alguien su situación que no tiene un shell ejecutar programas de todos modos). Podría estar equivocado, sin embargo - Lo que más me familiarizado con la funcionalidad de SFTP en OpenSSH y el servidor SSH propietaria Sun utiliza para enviar ...voretaq7 señaló que el cliente sftp no admite la transferencia de datos canalizados para los usuarios, que solo pueden usar sftp para conectarse al servidor.
Afortunadamente, hay libssh2, que admite sftp. así que solo necesitamos otros 2 clientes que usen libssh2, a los que he llamado:
el código fuente se puede encontrar en la siguiente URL: http://www.qxs.ch/2012/07/05/sftp-upload-tool/
Como no tengo tanta experiencia en la programación de libssh2, estoy feliz de recibir cualquier comentario sobre el código fuente.
fuente