Estoy escribiendo un script de shell que debe ser algo seguro, es decir, no pasa datos seguros a través de parámetros de comandos y preferiblemente no utiliza archivos temporales. ¿Cómo puedo pasar una variable al stdin de un comando? O, si no es posible, ¿cómo usar correctamente los archivos temporales para dicha tarea?¿Cómo pasar el valor de una variable al stdin de un comando?
Respuesta
Algo tan simple como:
echo "$blah" | my_cmd
Tenga cuidado con los espacios en su variable: 'echo" $ blah '' es mejor. –
@Jonathan: Ese es un buen punto. Respuesta actualizada en consecuencia ... –
Funcionará incluso cuando hay un '" 'en' $ blah'? –
Prueba esto:
echo "$variable" | command
pero no aparecería el contenido $ variable en, por ejemplo, la salida de 'ps -u' cuando echo se está ejecutando? –
no, no lo hará. 'echo' está integrado, por lo que no hay ningún proceso para mostrar en ps – unbeli
Tenga cuidado con los espacios en su variable:' echo "$ variable" 'es mejor. –
(cat <<END
$passwd
END
) | command
El cat
no es realmente necesario, pero ayuda a estructurar el código mejor y le permite utilizar más comandos entre paréntesis como entrada a su comando.
Pero este método le permite pasar varias líneas a su comando y también permite espacios en '$ passwd' – PoltoS
Esta es la mejor respuesta hasta el momento que no pierde contenidos variables para canalizar o procesar la inspección. – user2688272
Pasando un valor de entrada estándar es tan simple como:
your-command <<< "$your_variable"
controlar siempre que ponga comillas alrededor expresiones variables!
Herestrings '<<<' no son gua para que estén disponibles, no están en la base POSIX, hasta donde yo sé. Funcionarán como se espera, siempre y cuando solo los ejecutes en 'bash'. Solo lo menciono, porque OP dijo 'shell' no específicamente 'bash'. Aunque marcó la pregunta con 'bash' ... por lo que esta sigue siendo obviamente una respuesta aceptable. – TechZilla
Si bien este puede ser el caso, es probable que la información sensible se filtre más fácilmente si se usa el método 'echo' debido a la creación de una tubería. El comando herestring será procesado completamente por 'bash', aunque en esta situación (como se señaló) es mejor que sepas que funcionará en tu bash, de lo contrario cualquier mensaje de error producido como resultado de no soportar herestrings también podría filtrar dicha información . –
@StevenLu Espera, 'echo' es un built-in. No hay tubería allí, ¿verdad? Es Unix, pero no puede ser * tanto Unix *. –
Tenga en cuenta que las operaciones 'echo "$var" | command
significan que la entrada estándar está limitada a la (s) línea (s) repetidas. Si también desea que el terminal para conectarse, a continuación, tendrá que ser más elegante:
{ echo "$var"; cat - ; } | command
(echo "$var"; cat - ) | command
Esto significa que la primera línea (s) será el contenido de $var
pero el resto provendrá de la lectura de su cat
entrada estándar. Si el comando no hace nada demasiado elegante (intente activar la edición de línea de comandos, o ejecutar como vim
) entonces estará bien. De lo contrario, debe ser realmente elegante: creo que expect
o uno de sus derivados es probable que sea apropiado.
Las anotaciones de línea de comando son prácticamente idénticas, pero el segundo punto y coma es necesario con las llaves, mientras que no está entre paréntesis.
' (echo " $ LIST "; cat -) | sed 1q' esto funciona para mí pero necesito presionar ctrl d cuando ejecuto este script? –
Sí, el' cat -' continúa leyendo desde el teclado hasta EOF o interrumpe, por lo que necesita para decirle EOF escribiendo control-D. –
¿Hay alguna manera de evitar las necesidades de EOF cat –
De acuerdo con la respuesta de Martin, no es una característica de bash llamado Aquí Cuerdas (que en sí es una variante de los Aquí Documentos apoyado más ampliamente de función).
http://www.gnu.org/software/bash/manual/bashref.html#Here-Strings
3.6.7 Aquí Cuerdas
una variante de aquí documentos, el formato es:
<<< word
La palabra se expande y se suministra al sistema en su estándar entrada.
Tenga en cuenta que esta medida serían Cuerdas para ser bash-solamente, así que, para mejorar la portabilidad, que probablemente sería mejor con el original Aquí cuentan con documentos, de acuerdo con la respuesta de PoltoS:
(cat <<EOF
$variable
EOF
) | cmd
o bien, una variante más simple de lo anterior:
(cmd <<EOF
$variable
EOF
)
puede omitir (
y )
, a menos que usted quiere tener este redirigido su vez en otros comandos.
Me gustó la respuesta de Martin, pero tiene algunos problemas según lo que hay en la variable. ! Este
your-command <<< """$your_variable"""
es mejor si la variable contiene "o
¿Pero por qué? Además, no puedo reproducir ningún problema: 'foo1 = -; foo2 = '"'; foo3 = \ !; cat <<<" $ foo1 "; cat <<<" $ foo2 "; cat <<<" $ foo3 "' funciona bien para mí. ¿Qué hacen exactamente los tres '? '¿hacer? AFAIK usted está anteponiendo y anexando una cadena vacía. – phk
Pruebe algo real. Al igual que tu comando es ssh somehost. y tu variable es un script de shell –
Sólo hacer:
printf "$my_var" | my_cmd
Si la var no contiene espacios a continuación, las cotizaciones pueden ser omitidos
Si se utiliza. bash entonces usted también puede hacer:
echo -n "$my_var" | my_cmd
Evitar usi ng echo sin -n porque canalizará el vraiable con un salto de línea adicional al final.
- 1. AJAX - Cómo pasar el valor al servidor
- 2. Patrón de comando: cómo pasar parámetros a un comando?
- 3. cómo pasar el argumento variable a exe?
- 4. ¿Cómo quitar una copia de un identificador de archivo STDIN?
- 5. pasar una variable booleana opcional
- 6. ¿Cómo pasar el valor de campo del modelo a una variable de JavaScript?
- 7. Creación de un grano de enumeración primavera y pasar el valor de una llamada al método
- 8. pasar una variable en un disparador
- 9. ¿Cómo pasar una variable por valor a una función anónima de JavaScript?
- 10. ¿Cómo pasar una variable de settings.py a una vista?
- 11. Cómo obtener salida de un comando bash en una variable
- 12. ¿Cómo pasar un valor específico al parámetro del convertidor?
- 13. Cómo pasar un valor enum al servicio web wcf
- 14. Pasar variable al script php que se ejecuta desde la línea de comando
- 15. Pasar una variable como argumento de plantilla
- 16. Imprimir el valor de una variable XSL
- 17. utilizar una variable en un comando sed
- 18. PHP Obtener variable al mismo valor de
- 19. cómo pasar una variable con redirect_to?
- 20. ¿Cómo pasar fácilmente una variable a un archivo .sass?
- 21. ¿Cómo almacenar el resultado de un comando de shell ejecutado en una variable en python?
- 22. ¿Cómo usar una variable de PowerShell como parámetro de comando?
- 23. Cómo pasar un número variable de argumentos a ant exec
- 24. Cómo obtener un valor de una variable de JSON
- 25. ¿Cómo una variable vincula su valor al DOM?
- 26. ¿Cómo puedo redireccionar stdin desde un script de shell a un comando en el script de shell?
- 27. ¿Cómo obtener el valor de bytes individuales de una variable?
- 28. Eliminación de ceros a la izquierda antes de pasar una variable de shell a otro comando
- 29. valor de una variable utilizando WinDbg
- 30. Cómo pasar los parámetros de valor de la tabla al procedimiento almacenado desde el código .net
¿Puede un atacante cambiar '$ PATH'? Para que 'cat' se pueda reemplazar por'/bin/cat "$ @" | tee/atacante/can/read/this/file' – 12431234123412341234123