Tenga en cuenta que no puedo almacenar primero el archivo localmente, es demasiado grande.
Esta página (desagradable) (desplazarse hasta el final) parece dar una respuesta, pero tengo problemas para desenredar la parte específica de las unidades de cinta:
Para hacer esto más concreto, así es como podría pensar que podría funcionar:
En máquina local:
% echo "pretend this string is a huge amt of data" | scp - remote.com:big.txt
(Eso está usando la convención, que scp no admite de hecho, de sustituir un guión por el archivo fuente para indicarle que lo obtenga de stdin).
Respuestas:
Puede canalizar a ssh y ejecutar un comando remoto. En este caso, el comando remoto es el
cat > big.txt
que copiará stdin en elbig.txt
archivo.Es fácil y directo, siempre que pueda usar ssh para conectarse al extremo remoto.
También puede usar
nc
(NetCat) para transferir los datos. En la máquina receptora (por ejemplo, host.example.com):Esto se configurará
nc
para escuchar el puerto 1234 y copiar todo lo enviado a ese puerto albig.txt
archivo. Luego, en la máquina de envío:Este comando le indicará
nc
al lado emisor que se conecte al puerto 1234 en el receptor y copie los datos de stdin a través de la red.Sin embargo, la
nc
solución tiene algunas desventajas:ssh
.ssh
solución, puede iniciar la transferencia desde solo uno de los puntos finales.fuente
tar -cvzf >(ssh destination 'cat > file') huge_directory_tree
nc
, también ofrece cifrado y compresión de sus datos de forma predeterminada y, lo que es más importante: detección de errores. Tuve situaciones en las que lo usénc
con un controlador de red defectuoso y los datos corruptos se transmitieron sin ser detectados. SSH fallará en esa situación, porque no puede descifrar / descomprimir datos defectuosos.Usando ssh:
fuente
Use nc (Net Cat), que no necesita guardar el archivo localmente.
fuente
nc
para esto. Una vez descargué una imagen de disco sin formato de una máquina a otra solo para descubrir mucho más tarde que mi controlador de red estaba defectuoso y transfería bits defectuosos. Usoscp
,ssh
o cualquier otra cosa que le dirá cuando hay un error de transmisión.Use una tubería FIFO:
fuente
scp
se quejó de que mypipe no era un archivo normal.mkfifo
embargo, tuve que usar para crear la tubería).scp <(ls) destination
Gracias Denis Scherbakov!
Cuando probé tu script en la nube Hetzner obtuve
Pero solo se creó un archivo sin contenido. Como el contenido real ya está encriptado con openssl, en realidad no necesitamos scp. El Linux incorporado
ftp
también tiene grandes capacidades de tubería. Así que aquí está mi solución (todavía bastante manual):fuente
Aquí hay una solución alternativa:
Todos los ejemplos anteriores que sugieren ssh + cat suponen que "cat" está disponible en el sistema de destino.
En mi caso, el sistema (copia de seguridad de Hetzner) tenía un conjunto de herramientas muy restrictivo que ofrecía sftp, pero no un shell completo. Entonces, usar ssh + cat no fue posible. Se me ocurrió una solución que utiliza el indicador "scp -t" no documentado. El guión completo se puede encontrar a continuación.
Actualización 2019.05.08:
Según la solicitud, a continuación se muestra una versión mucho más simple y más corta.
fuente
scp -t
? En este momento tiene un script completo altamente personalizado / localizado en su entorno. Una buena cosa para el wiki de Hetzner, pero no para Super User, donde la mayoría de las personas solo buscan cómo canalizar la entrada a través de scp.