La pipe doit-elle écrire un fichier temporaire?


11

J'ai trouvé que si je transfère une grande quantité de données entre deux processus via pipe, un fichier temporaire sera créé par linux dans le répertoire / tmp. Si l'opération de canal réussit, le fichier temporaire correspondant sera automatiquement supprimé par le système d'exploitation. Mais si l'opération a échoué, le fichier tmp reste là.

Pour une raison quelconque, je ne veux pas que l'utilisateur ait l'opportunité d'obtenir les données que j'ai transférées via le canal, donc je ne veux rien laisser sur le disque dur même si mon programme s'est écrasé. Comment puis-je faire ceci?


4
Je doute fort que ce soit l'OS qui crée ces fichiers, en particulier, je doute que ce soit l'opération de pipe.

@Neil: Très bon point. @OP: Êtes-vous sûr que le récepteur ne met pas en cache les données qu'il reçoit sur stdin dans le fichier tmp? Si ce n'est pas votre propre code et non open source, vous pouvez probablement vérifier en redirigeant votre sortie de votre expéditeur vers un fichier, puis en l'envoyant dans le processus récepteur en tant que flux d'entrée, par exemple: sender > filenamethen receiver < filename. Je vérifierais le fichier tmp pendant les deux opérations, pour voir si l'expéditeur ou le destinataire le fait.

2
Pas une réponse, mais j'ai trouvé beaucoup d'informations utiles sur la gestion des tuyaux ici: < slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible >. Je ne sais pas à quel point cette personne fait autorité, mais il mentionne spécifiquement qu'un mkfifotube créé ne fait jamais de tampon (du tout!) Et ne crée jamais de fichiers.
Carl Smotricz

1
@Carl Smotricz: lien est rompu, alors voici: slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible

En outre, l'écriture dans un tuyau bloquera si le tuyau est trop plein (jusqu'à ce que quelqu'un lise de l'autre côté).

Réponses:


11
  1. les canaux ne stockent pas de données sur le disque. / bin / echo foo | la barre grep ne crée aucun fichier. essayez strace -f sh -c '/bin/echo foo | grep bar' de voir tous les appels système effectués par un shell lors de l'exécution d'un pipeline. echoest un shell intégré, j'ai donc suggéré /bin/echode faire tourner le shell en exécutable.

  2. /tmpn'a pas besoin d'être sur le disque. Il peut être monté sur tmpfs (c'est-à-dire soutenu par de la mémoire virtuelle). Notez qu'un redémarrage sera vide /tmpdans ce cas, donc utilisez-le /var/tmppour tout ce que vous voulez laisser.

Si ce que vous faites est de mettre des données dans un fichier, cela n'utilise pas de canal. Si le fichier est un fifo, pas un fichier normal, il s'agit simplement d'un rendez-vous nommé et ne contient pas de données. Utilisez ls -l pour le savoir.

Et notez que si vous espérez empêcher les utilisateurs de voir ce qui se passe dans les tuyaux dans les processus qu'ils possèdent, vous êtes à peu près SOL, car vous stracepouvez inspecter tout ce qu'un processus fait qui interagit avec tout ce qui se trouve en dehors du processus, à l'exception de la lecture / écriture partagée mappée. Mémoire. ltraceest encore plus invasif. Si votre programme s'exécute sur des systèmes où l'utilisateur local a root, vous ne pouvez pas les arrêter du tout. Sous Unix, root peut tout faire et dispose d'outils puissants à cet effet.


1

Un vrai tube est un bloc de mémoire dans le noyau, un tampon qui est lu / écrit par certains processus. Il ne crée de fichiers nulle part.

Certaines applications ont des options qui basculent entre l'utilisation de tuyaux (plus rapide, sans disque, prend un peu plus de mémoire) et l'utilisation de fichiers temporaires (prend un peu moins de mémoire, vous permet éventuellement de voir les fichiers temporaires, un peu plus lentement). gccest une de ces applications, mais il en existe probablement d'autres.


0

Piratage sale: cryptez les données avant d'envoyer et décryptez-les à la réception si vous pouvez modifier les deux processus ...


Je n'appellerais pas cela un hack sale, en fait: si les données sont sensibles, cela semble une solution appropriée. Mais je suis curieux de connaître le fichier tmp. L'OP a-t-il raison que le noyau le crée? Ou est-ce que Neil a raison et que c'est une extrémité du tuyau ou l'autre ...

Le noyau ne crée pas de fichier temporaire. D'un autre côté, il est très probable que le processus de réception crée un fichier temporaire. Ceci est assez courant, car si vous souhaitez rechercher dans votre entrée, vous devez d'abord l'écrire dans un fichier.
larsks
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.