kali google decode64 convert bash unix sed base64 backreference

bash - google - linux base64 to binary



pasando sed retroreferencia al comando base64 (2)

Lo que intento lograr es pasar el valor codificado en Base64 capturado en la expresión regular sed a la base64 y hacer que se descodifique.

Pero el problema es que, aunque parece que se pasa el valor correcto a la función utilizando la retro-referencia, base64 queja de que la entrada no es válida.

Lo siguiente es mi guion:

#!/bin/bash decodeBaseSixtyFour() { echo "$1 is decoded to `echo $1 | base64 -d`" } echo Passing direct value ... echo SGVsbG8gQmFzZTY0Cg== | sed -r "s/(.+)$/$(decodeBaseSixtyFour SGVsbG8gQmFzZTY0Cg==)/" echo Passing captured value ... echo SGVsbG8gQmFzZTY0Cg== | sed -r "s/(.+)$/$(decodeBaseSixtyFour //1)/"

Y cuando se ejecuta, produce la siguiente salida:

Passing direct value ... SGVsbG8gQmFzZTY0Cg== is decoded to Hello Base64 Passing captured value ... base64: invalid input SGVsbG8gQmFzZTY0Cg== is decoded to

Creo que el resultado explica a qué me refiero.

¿Es posible hacer lo que estoy tratando de hacer? Si no, ¿por qué?


Perl s/// puede hacer lo que quieras, pero no creo que lo que estás pidiendo sea lo que necesitas.

$ echo SGVsbG8gQmFzZTY0Cg== | perl -MMIME::Base64 -pe ''s/(.+)/decode_base64($1)/e'' Hello Base64

Lo que está sucediendo en realidad:

echo SGVsbG8gQmFzZTY0Cg== | sed -r "s/(.+)$/$(decodeBaseSixtyFour //1)/"

  • Antes de que sed comience a leer la entrada, el shell nota la sustitución del proceso en la cadena citada.
  • la función decodeBaseSixtyFour se llama con la cadena "//1"
  • base64 se bloquea en la entrada /1 y emite el mensaje de error
  • la función devuelve la cadena "/1 is decoded to "
  • ahora el script sed es ''s/(.+)$//1 is decoded to /'' que es como se obtiene la última línea.

Como comenté, sed no puede hacer un equivalente de replace_callback que es esencialmente lo que estás tratando de hacer.

Seguir awk se acerca mucho a lo que estás tratando de hacer:

s="My string is SGVsbG8gQmFzZTY0Cg== something" awk ''{for(i=1; i<=NF; i++) if ($i~/==$/) "base64 -D<<<"$i|getline $i}1''<<<"$s" My string is Hello Base64 something