Écrire dans un fichier sans redirection?

12

J'écris une application compilée régulière qui doit créer un fichier spécial et y écrire un cookie magique. Je ne peux pas écrire le fichier directement depuis l'application, le modèle de sécurité du système m'oblige à lancer un outil d'aide avec des privilèges élevés pour faire l'affaire. Je peux fournir n'importe quel nombre d'arguments à l'outil d'aide. Maintenant, je voudrais choisir une commande système très simple qui servirait d'outil d'assistance et créerait le fichier pour moi. Quelque chose comme ça:

/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"

Simple touchne le coupe pas car j'ai besoin d'écrire le cookie dans le fichier, un simple echosans le shell shell ne fonctionne pas car il a besoin d'une redirection pour écrire le fichier. Je ne me sens pas à l'aise d'appeler le shell avec les privilèges root pour effectuer une tâche aussi triviale. Existe-t-il une commande système vraiment simple et contrainte que je pourrais appeler pour écrire le fichier pour moi?

zoul
la source
Y a-t-il une raison pour laquelle cela /bin/sh -c 'echo magic > /path/to/magic/file'ne fonctionne pas? Ce serait un fichier exécutable et deux arguments. Vous devrez créer le dernier argument sous forme de chaîne (avec sprintf ou équivalent). Y a-t-il une raison pour laquelle cela ne fonctionnerait pas pour vous? D'après votre question, il semble que doCommandAsRoot () ne prend pas d'entrée pour diffuser la commande, n'est-ce pas? Sinon, vous pouvez remplacer le dernier argument par 'cat > /path/to/magic/file'et transmettre les données au lieu de construire une chaîne.
Arcege
L'exemple de shell fonctionne, mais je détesterais appeler le shell avec les privilèges root juste pour créer un fichier simple. La bibliothèque prend un argument de canal de communication (c'est AuthorizationExecuteWithPrivileges ), qui pourrait être utilisé pour écrire le cookie à l'aide tee. Merci!
zoul

Réponses:

11

Que dis-tu de ça:

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

Bien sûr, il y a des redirections mais seulement les départs en tant que root ne sont pas un shell. Fonctionne dd of=...aussi avec .

stribika
la source
2
Désolé, j'ai évidemment du mal à m'expliquer ces derniers temps. Le problème est que lorsque je veux exécuter quelque chose avec des privilèges élevés, je dois passer par un appel de bibliothèque spécial (quelque chose comme doCommandAsRoot). Et cette fonction n'accepte qu'un chemin d'accès à la commande et à ses arguments, il n'y a donc aucun moyen pour moi d'utiliser la redirection de sortie tout de suite. Je pourrais passer par le shell (comme indiqué dans la question), mais je n'aime pas cela en termes de sécurité.
zoul
@zoul: Je pensais que vous écrivez un script shell. Est-il correct d'écrire le cookie magique dans un fichier accessible aux processus non privilégiés? Si c'est le cas, écrivez-le dans un tel fichier et appelez doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file").
stribika
Non, c'est une application compilée régulière (question mise à jour). Je cherche juste des commandes «shell» pour servir d'aide afin que je n'ai pas à l'écrire moi-même. Oui, le cookie n'a rien de sensible. L' ddexemple est assez proche de ce que je veux, merci. Pourriez-vous penser à quelque chose d'encore plus simple?
zoul
Bien sûr, vous pouvez utiliser cpou à la mvplace de dd.
mattdm
Je veux dire plus simple car sans avoir besoin de copier :)
zoul
9

Sans redirection de sortie, sans pipe, mais avec "ici chaîne":

dd of=/some/where/file <<<'magic'
Rainer Perske
la source
Un inconvénient de cette approche est que dd écrit certaines statistiques sur stdout. Vous pouvez utiliser> / dev / null pour les masquer, mais à ce stade, vous pourriez aussi bien utiliser tee.
studgeek
1
Cela a fonctionné pour moi dans une situation inhabituelle où je ne pouvais pas utiliser la redirection de sortie ou les tuyaux. status=nonesupprimera toutes les autres sorties des versions modernes de coreutils GNU dd.
Michael Hampton
5

Il y a une autre considération, c'est que vous ne voulez pas mettre la valeur du cookie magique sur une ligne de commande, car cela peut être observé par d'autres utilisateurs. Même si le programme est de courte durée (y compris si le programme met à zéro la chaîne de ligne de commande), il existe une possibilité d'attaque. Donc, une théorie:

writestringtofile 'magic' /some/where/file

est une approche dangereuse. Par conséquent, j'approuve la suggestion de @ stribika: écrire la valeur dans un fichier temporaire et la copier en place. Assurez-vous d'utiliser une fonction sécurisée pour créer le fichier temporaire ( mkstemp()) afin qu'il n'y ait pas de condition de concurrence là aussi.

mattdm
la source
Merci, c'est une discussion utile. Heureusement, le «cookie magique» n'est pas un dispositif de sécurité, il peut être clairement vu par n'importe qui.
zoul
0

éponge de moreutils - absorber l'entrée standard et écrire dans un fichier:

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

Contrairement à une redirection de shell, l' éponge absorbe toutes ses entrées avant d'écrire le fichier de sortie. Lorsque cela est possible, l' éponge crée ou met à jour le fichier de sortie de manière atomique en renommant un fichier temporaire en place.

Voir plus

Ilya Murav'jov
la source