script - ¿Cómo transferir datos a un archivo remoto a través de SFTP sin almacenar datos en un archivo local en Linux Bash?
sftp shell script example (3)
Necesito poder transferir datos de la memoria a un archivo remoto a través de SFTP. Originalmente tuve esto funcionando a través de SSH, y mientras trabajaba, descubrí que no tengo acceso SSH a la ubicación remota, solo acceso a SFTP.
Aquí hay un ejemplo del código SSH original que tuve:
echo "secret_data" | ssh root@localhost cat > secret_file;
Esto es exactamente lo que necesito, pero en algún tipo de forma de:
sftp root@localhost put $secret_data secret_file;
En principio, necesito que los datos nunca se almacenen en un archivo en la máquina local y se traten por completo desde la memoria.
Cualquier respuesta apreciada. Gracias.
Cree la partición tmpfs
en /etc/fstab
(no almacenada en la unidad, solo en la memoria), almacene el archivo allí y luego use el método descrito si realmente desea evitar almacenar el archivo en su disco duro.
Configuré de esta manera /tmp
y /var/log
para evitar escribir en todo el disco SSD:
# <file system> <mount point> <type> <options> <dump> <pass>
none /tmp/ tmpfs size=15% 0 0
El cliente multiprotocolo lftp admite explícitamente la lectura de contenido desde un descriptor de archivo no buscable:
#!/bin/bash
# ^^^^ some features used here are not present in /bin/sh
lftp /
-u remote_username /
-e ''put -o /tmp/secret /dev/stdin'' /
sftp://remote_host /
< <(printf ''%s'' "$secret_data")
Tenga en cuenta el uso de <()
en lugar de <<<
(este último puede, en algunas situaciones, implementarse escribiendo un archivo temporal; el primero será una redirección de estilo /dev/fd
en Linux moderno, o puede implementarse) con un FIFO en algunas otras plataformas).
Si es permisible usar su propia copia pirateada de sftp, puede usar
echo "my secret data 2" | (exec 6<&0 ; ( echo put /proc/self/fd/6 /tmp/secret | sftp user@remote_host))
El ejecutivo redirecciona el stdin, que transporta su secreto, a otro descriptor de archivo, en este caso, 6. El segundo echo emite el comando sftp para ejecutar. Utiliza el sistema de archivos /proc/
magic, la redirección / proc / self a /proc/<pid>
del proceso que la abre, y el nombre proc/<pid>/fd/6
del descriptor de archivo 6, y copias los datos que lee de allí a un archivo en su host remoto.
Sería mucho más fácil si pudieras usar una versión pirateada de scp, esto leería
echo "my secret data 2" | scp /proc/self/fd/0 user@remote_host:/tmp/secret
Ahora para el truco: sftp y scp asegúrese de que el archivo local sea un archivo normal, pero los descriptores de archivo / proc / self / fd / ... son pipes. Debe desactivar las verificaciones en el código fuente.
Para sftp, debe modificar el archivo sftp-client.c: Encuentre todas las ocurrencias de S_ISREG(...)
y reemplácelas con 1
Esto es rápido y sucio y puede dejarlo abierto a las vulnerabilidades de seguridad si no revisa regularmente los mensajes de seguridad de openssh y recompila si es necesario. Una mejor manera sería usar un lenguaje de scripting con una biblioteca sftp bien mantenida y usar eso.