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 touch
ne le coupe pas car j'ai besoin d'écrire le cookie dans le fichier, un simple echo
sans 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?
/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.tee
. Merci!Réponses:
Que dis-tu de ça:
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 .la source
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é.doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file")
.dd
exemple est assez proche de ce que je veux, merci. Pourriez-vous penser à quelque chose d'encore plus simple?cp
ou à lamv
place dedd
.Sans redirection de sortie, sans pipe, mais avec "ici chaîne":
la source
status=none
supprimera toutes les autres sorties des versions modernes de coreutils GNUdd
.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:
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.la source
éponge de moreutils - absorber l'entrée standard et écrire dans un fichier:
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
la source