Estoy escribiendo una aplicación compilada regular que necesita crear un archivo especial y escribir una cookie mágica en él. No puedo escribir el archivo directamente desde la aplicación, el modelo de seguridad del sistema requiere que inicie una herramienta auxiliar con privilegios elevados para hacer el truco. Puedo proporcionar cualquier número de argumentos a la herramienta auxiliar. Ahora me gustaría elegir un comando de sistema muy simple que sirva como herramienta auxiliar y crear el archivo para mí. Algo como esto:
/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"
Simple touch
no lo corta, ya que necesito escribir la cookie en el archivo, un simple echo
sin el envoltorio de shell no funciona, ya que necesita una redirección para escribir el archivo. No me siento cómodo llamando al shell con privilegios de root para hacer una tarea tan trivial. ¿Hay algún comando de sistema realmente simple y restringido al que pueda llamar para escribir el archivo por mí?
/bin/sh -c 'echo magic > /path/to/magic/file'
que no funciona? Eso sería un archivo ejecutable y dos argumentos. Tendría que construir el último argumento como una cadena (con sprintf o equivalente). ¿Hay alguna razón para que esto no funcione para ti? De su pregunta, parece que doCommandAsRoot () no toma datos para transmitir al comando, ¿correcto? De lo contrario, podría reemplazar el último argumento con'cat > /path/to/magic/file'
y pasar los datos en lugar de construir una cadena.tee
. ¡Gracias!Respuestas:
Qué tal esto:
Claro que hay redirecciones en esto, pero solo tee se ejecuta como root, no como shell. Funciona con
dd of=...
también.fuente
doCommandAsRoot
). Y esta función solo acepta una ruta al comando y sus argumentos, por lo que no hay forma de que use la redirección de salida de inmediato. Podría pasar por shell (como se muestra en la pregunta), pero no me gusta eso en cuanto a seguridad.doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file")
.dd
ejemplo está bastante cerca de lo que quiero, gracias. ¿Se te ocurre algo aún más simple?cp
o enmv
lugar dedd
.Sin redireccionamiento de salida, sin canalización, pero con "aquí cadena":
fuente
status=none
suprimirá todos los demás resultados de versiones modernas de GNU coreutilsdd
.Hay otra consideración, que es que no desea poner el valor de la cookie mágica en una línea de comando, ya que eso puede ser observado por otros usuarios. Incluso si el programa es de corta duración (incluso si el programa pone a cero la cadena de la línea de comando), existe la posibilidad de ataque. Entonces, un teórico:
Es un enfoque peligroso. Por lo tanto, respaldo la sugerencia de @ stribika: escriba el valor en un archivo temporal y cópielo en su lugar. Asegúrese de utilizar una función segura para crear el archivo temporal (
mkstemp()
) para que no haya una condición de carrera allí también.fuente
esponja de moreutils: absorba la entrada estándar y escriba en un archivo:
A diferencia de un redireccionamiento de shell, la esponja absorbe toda su entrada antes de escribir el archivo de salida. Cuando sea posible, la esponja crea o actualiza el archivo de salida atómicamente cambiando el nombre de un archivo temporal en su lugar.
Ver más
fuente