ver node mostrar linea entorno dotenv comandos node.js escaping environment-variables

node.js - node - ¿Variables de entorno que contienen nuevas líneas en Nodo?



variables de entorno node js windows 10 (4)

Node tomará las variables del entorno y las escapará para evitar la interpolación:

% export X="hey/nman" % echo $X hey man % node > process.env[''X''] ''hey//nman'' >

Una opción es establecer la variable fuera del nodo con nuevas líneas reales:

% export X="hey dquote> man" % node > process.env[''X''] ''hey/nman'' > console.log(process.env[''X'']) hey man undefined >

Esto también funciona dentro de los archivos de script, solo use las nuevas líneas entre comillas. También puedes hacer un reemplazo:

% export X="hey/nman/ndude/nwhat" % node > console.log(process.env[''X''].replace(///n/g, ''/n'')) hey man dude what

Estoy intentando cargar una clave privada RSA en mi aplicación nodejs usando variables de entorno, pero parece que las nuevas líneas se están escapando automáticamente.

Para lo siguiente, supongamos que la PRIVATE_KEY env está establecida en lo siguiente (no es mi clave real):

PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----/nMIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp/nwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5/n1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh/n3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2/npIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX/nGukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il/nAkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF/nL0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k/nX6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl/nU9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ/n37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0=/n-----END RSA PRIVATE KEY-----"

Si llamo a console.log directamente con la cadena anterior, obtengo lo siguiente como resultado:

-----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp wmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5 1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh 3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2 pIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX GukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il AkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF L0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k X6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl U9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ 37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0= -----END RSA PRIVATE KEY-----

Puedes ver que los caracteres de nueva línea están siendo respetados. Sin embargo, si llamo console.log(process.env["PRIVATE_KEY"]) , la salida contiene el /n literal en lugar de las nuevas líneas reales:

-----BEGIN RSA PRIVATE KEY-----/nMIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp/nwmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5/n1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh/n3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2/npIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX/nGukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il/nAkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF/nL0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k/nX6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl/nU9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ/n37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0=/n-----END RSA PRIVATE KEY-----

He estado tratando de encontrar más información en línea sobre cómo el nodo procesa las variables de entorno sin suerte. ¿Cómo puedo cargar esta clave a través de env vars mientras mantengo caracteres de nueva línea? Si eso no es posible, ¿cómo puedo restaurarlos?


Si está usando dotenv : lo resolvimos de esta manera, con nuevas líneas y JSON.parse ( esto permite que los caracteres escapados con barra invertida dentro de la cadena, no solo /n ):

en .env:

MY_KEY=''-----BEGIN CERTIFICATE-----/nabcde...''

en server.ts:

myKey = JSON.parse(`"${process.env.MY_KEY}"`), // convert ''/n''

Ver hilo: https://github.com/motdotla/dotenv/issues/218


Simplemente reemplace /n antes de usar el valor:

var private_value = process.env.PRIVATE_KEY.replace(///n/g, ''/n''); console.log(private_value);

resultará correctamente:

-----BEGIN RSA PRIVATE KEY----- MIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp wmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5 1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh 3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2 pIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxECQQDeAw6fiIQX GukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il AkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF L0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k X6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl U9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ 37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0= -----END RSA PRIVATE KEY-----


Node.js, refleja correctamente las variables de entorno que tienen líneas nuevas reales incrustadas , como lo demuestra el siguiente fragmento de bash :

$ PRIVATE_KEY=$''ab/ncde'' node -p ''process.env["PRIVATE_KEY"].indexOf("/n")'' 2 # 0-based index of the (first) actual newline char. in env. var. ''PRIVATE_KEY''

Tenga en cuenta que $''...'' es un tipo especial de cadena de bash en la que las secuencias de escape como /n se expanden, por lo que en el comando anterior, PRIVATE_KEY se define con 2 líneas y se pasa como una variable de entorno a un node (simplemente la asignación de la variable al comando para invocar, que es una característica estándar en shells de tipo POSIX).

De hecho, Node no interpreta el valor de las variables de entorno de ninguna manera (lo que es correcto).

Debe ser que su variable PRIVATE_KEY no contenga nuevas líneas reales, sino /n literales (a / char. Seguido de char. n ).

  • Si el comando de asignación PRIVATE_KEY="..." en la pregunta es un comando de shell , eso lo explicaría: en shells POSIX como bash , /n dentro de una cadena "..." se deja como está .

    • Por el contrario, las cadenas "..." JavaScript interpolan secuencias de escape como /n , por lo que al pasar una cadena de este tipo directamente a console.log() generan nuevas líneas; por ejemplo, node -e ''console.log("ab/ncde")'' hecho genera 2 líneas.
  • PRIVATE_KEY="ab/ncde" node -p ''process.env["PRIVATE_KEY"]'' (literalmente) genera ab/ncde , lo que muestra que /n se mantuvo como un literal.

Tienes dos opciones para solucionar tu problema:

  • Preferiblemente, defina su variable de entorno con nuevas líneas reales para comenzar - vea más abajo.

  • Alternativamente, si no controla cómo se establece la variable de entorno , expanda los /n literales a nuevas líneas reales en su código Node.js (JavaScript): vea la útil respuesta de Adriano Godoy .

Para definir PRIVATE_KEY con PRIVATE_KEY reales en shells POSIX , use una de las siguientes técnicas:

export PRIVATE_KEY=$''-----BEGIN RSA PRIVATE KEY-----/n..../n-----END RSA PRIVATE KEY-----''

  • otros, como el dash (y desde cualquier script de shell que use sh ):

export PRIVATE_KEY="$(printf %s ''-----BEGIN RSA PRIVATE KEY-----/n..../n-----END RSA PRIVATE KEY-----'')"

Alternativamente, para una mejor legibilidad, puede usar una sustitución de comando con un documento aquí:

export PRIVATE_KEY="$(cat <<''EOF'' -----BEGIN RSA PRIVATE KEY----- ... ... -----END RSA PRIVATE KEY----- EOF )"