¿Escribir en un archivo sin redireccionamiento?

12

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 touchno lo corta, ya que necesito escribir la cookie en el archivo, un simple echosin 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í?

zoul
fuente
¿Hay alguna razón por la /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.
Arcege
El ejemplo de shell funciona, pero odiaría llamar al shell con privilegios de root solo para crear un archivo simple. La biblioteca toma un argumento de canalización de comunicación (es AuthorizationExecuteWithPrivileges ), que podría usarse para escribir la cookie usando tee. ¡Gracias!
zoul
Consulte también stackoverflow.com/a/18146890/2032064
Mifeet el

Respuestas:

11

Qué tal esto:

echo -n 'magic' | sudo tee /some/where/file > /dev/null

Claro que hay redirecciones en esto, pero solo tee se ejecuta como root, no como shell. Funciona con dd of=...también.

Stribika
fuente
2
Lo siento, obviamente tengo problemas para explicarme últimamente. El problema es que cuando quiero ejecutar algo con los privilegios elevados, tengo que pasar por una llamada especial a la biblioteca (algo así como 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.
zoul
@zoul: pensé que estabas escribiendo un script de shell. ¿Está bien escribir la cookie mágica en un archivo accesible para procesos sin privilegios? Si es así, escríbalo en dicho archivo y llame doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file").
stribika
No, es una aplicación compilada regular (pregunta actualizada). Solo estoy buscando comandos de "shell" para servir como ayudante para no tener que escribirlo yo mismo. Sí, la cookie no es nada sensible. El ddejemplo está bastante cerca de lo que quiero, gracias. ¿Se te ocurre algo aún más simple?
zoul
Claro, podrías usar cpo en mvlugar de dd.
mattdm
Me refiero más simple que , sin la necesidad de copiar :)
Zoul
9

Sin redireccionamiento de salida, sin canalización, pero con "aquí cadena":

dd of=/some/where/file <<<'magic'
Rainer Perske
fuente
Una desventaja de este enfoque es que dd escribe algunas estadísticas en stdout. Puede usar> / dev / null para ocultarlos, pero en ese punto también podría usar tee.
studgeek
1
Esto funcionó para mí en una situación inusual en la que no podía usar la redirección de salida o las tuberías. status=nonesuprimirá todos los demás resultados de versiones modernas de GNU coreutils dd.
Michael Hampton
5

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:

writestringtofile 'magic' /some/where/file

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.

mattdm
fuente
Gracias, esta es una discusión útil. Afortunadamente, la "cookie mágica" no es un dispositivo de seguridad, cualquiera puede verla claramente.
zoul
0

esponja de moreutils: absorba la entrada estándar y escriba en un archivo:

echo -n 'magic' | sponge /some/where/file

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

Ilya Murav'jov
fuente