El problema con la respuesta de @jakuje es: solo funciona con sockets , pero no puede utilizar herramientas UNIX estándar que esperan archivos con ellos:
ssh -R/tmp/sock.remote:/tmp/sock.local "$HOST" 'LANG=C cat >/tmp/sock.remote'
bash: /tmp/sock.remote: No existe tal dispositivo o dirección
También existe el problema de que el archivo de socket local no se elimina en el host remoto; la próxima vez que ejecute el mismo comando, recibirá una advertencia y el socket no se volverá a crear correctamente. Puede dar la opción -o StreamLocalBindUnlink=yes
de ssh
desvincular ese socket antiguo, pero en mis pruebas no fue suficiente; también tiene que editarlo sshd_config
para contener StreamLocalBindUnlink=yes
esa opción para que funcione.
Pero puede usar socat
o netcat
cualquier otra herramienta similar que admita sockets locales UNIX (¡ NOnetcat-traditional
es suficiente!) Para usar el reenvío de sockets locales para la transferencia de archivos:
# start local process listening on local socket, which receives the data when ssh opens the connections and saves it to a local file
nc -l -N -U /tmp/sock.local >/tmp/file.local &
# connect to remote $HOST and pipe the remote file into the remote socket end
ssh \
-o ExitOnForwardFailure=yes \
-o StreamLocalBindUnlink=yes \
-R /tmp/sock.remote:/tmp/sock.local \
"$HOST" \
'nc -N -U /tmp/sock.remote </tmp/file.remote'
También puede ejecutar comandos interactivos, en cuyo caso debe usar ssh -t
para asignar TTY.
El problema con esta solución es que debe codificar las rutas de los sockets locales de UNIX: localmente, este no es un problema tan grande como puede incluir $$
en la ruta para que sea único por proceso o usuario, un directorio temporal, pero en el es mejor que no use el directorio de escritura mundial /tmp/
como lo hago en mi ejemplo. El directorio también debe existir cuando ssh
se inicia la sesión. Y el inodo del socket permanecerá incluso después de que se cierre la sesión, por lo que usar algo como "$ HOME / .ssh. $$" desordenará su directorio con inodos muertos a lo largo del tiempo.
También puede usar los sockets TCP vinculados localhost
, lo que le ahorrará el desorden de sus sistemas de archivos con inodos muertos, pero incluso con ellos aún tiene problemas para elegir un número de puerto (único) no utilizado. Entonces todavía no es ideal. ( ssh
tiene código para asignar puertos dinámicamente, pero no encontré ninguna forma de recuperar esa información en el host remoto).
Probablemente, la solución más fácil para copiar archivos es usar la funcionalidad de intercambio de conexiones incorporada de ssh y hacer un comando scp
o sfrp
mientras su sesión interactiva todavía se ejecuta en paralelo. Consulte Copiar un archivo al sistema local con ssh .
closefrom(STDERR_FILENO + 1)
llamadas bajo el código fuente de OpenSSH. ¿Qué estás tratando de hacer que exige esto?