Nota: mientras sigue esta solución, escriba los comandos en una sola sesión de shell (o use un solo script) a menos que se indique lo contrario. Esto se debe a que utiliza variables y descriptores de archivo, no están disponibles directamente fuera de su sesión original.
Crear un fifo temporal. La forma correcta de crear un archivo temporal es con mktemp
. Desafortunadamente no se puede crear quince. Puede crear un directorio temporal aunque:
tmpd=`mktemp -d`
tmpf="$tmpd"/fifo
mkfifo "$tmpf"
printf "%s\n" "$tmpf" # just to know the path to the fifo, it may be useful later
Alternativamente, puede crear un fifo nombrado a mano en alguna ubicación fija o ad-hoc. Tu decides.
Cree un proceso en segundo plano que lea el fifo y pase los datos a un servidor:
nc 192.168.1.115 12345 < "$tmpf" &
ncpid=$! # PID may be useful later
Prestar atención si nc
no sale prematuramente Suponiendo que no haya problemas con la conexión en sí misma ni con el servidor, el comando de fondo anterior permanecerá conectado hasta que termine de enviar el primer grupo de datos a través del fifo. Pero desea que permanezca abierto y acepte escrituras múltiples, así que abra el fifo y no lo cierre (todavía):
exec 3> "$tmpf"
Ahora puedes enviar lo que quieras a través del fifo y la conexión de fondo persiste:
echo abcd >&3 # sends text
echo -e '\x80' >&3 # sends "binary"
cat /etc/issue >&3 # sends file
cat >&3 # type whatever you want, terminate with Ctrl+D
Cualquiera de estos comandos puede invocarse con la ruta al fifo en lugar de &3
, si tan solo conoces el camino. Conociendo el camino, puedes escribir al fifo desde el mismo o otro sesión de shell:
cat > /path/to/the/fifo # type whatever you want, terminate with Ctrl+D
O puede abrir un descriptor en otra sesión de una manera similar a la original. De cualquier forma que escribas a la fifo, la nc
Lo pasará al servidor remoto en una sola conexión.
Pero cuidado con las condiciones de la raza. Usar un solo descriptor dentro de una sola sesión de shell es una buena manera de evitarlos.
Después de pasar los datos que necesita, finalice la nc
y cierre el descriptor en la sesión de shell original:
kill $ncpid
exec 3>&-
Tenga en cuenta en algunas circunstancias que el único último comando es suficiente para hacer el fondo nc
salida; depende de lo que hiciste y lo que todavía estás haciendo con el fifo. Por esta razón elegí matar al nc
explícitamente.
Elimine el directorio temporal y su contenido (es decir, el fifo):
rm -r "$tmpd"
Nota final:
No es necesario poner nc
en el fondo en primer lugar. Puede ejecutarlo en un terminal, escribir en el fifo (conociendo su ruta) desde otro. De esta manera usted puede monitorear fácilmente su estado. Adapte esta solución a sus necesidades.
echo -e '\x80\xF4\x12' | xclip -i
en otra terminal, luego pegar en elnc
terminal, pero la configuración de entrada del terminal se está interponiendo y no sé cómonc
establece esto, ni puedo encontrar configuraciones que funcionen constty ... ; cat | xxd ; stty sane
.