GNU/Linux >> Tutoriels Linux >  >> Linux

Est-il possible de simuler un chemin spécifique pour un processus ?

LD_PRELOAD n'est pas trop difficile, et vous n'avez pas besoin d'être root.Interposez votre propre routine C qui est appelée à la place du vrai open() dans la bibliothèque C. Votre routine vérifie si le fichier à ouvrir est "/tmp/adb.log" et appelle le vrai open avec un nom de fichier différent. Voici votre shim_open.c :

/*
 * capture calls to a routine and replace with your code
 * gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c
 * LD_PRELOAD=/.../shim_open.so cat /tmp/adb.log
 */
#define _FCNTL_H 1 /* hack for open() prototype */
#define _GNU_SOURCE /* needed to get RTLD_NEXT defined in dlfcn.h */
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <dlfcn.h>
#define OLDNAME "/tmp/adb.log"
#define NEWNAME "/tmp/myadb.log"

int open(const char *pathname, int flags, mode_t mode){
    static int (*real_open)(const char *pathname, int flags, mode_t mode) = NULL;

    if (!real_open) {
        real_open = dlsym(RTLD_NEXT, "open");
        char *error = dlerror();
        if (error != NULL) {
            fprintf(stderr, "%s\n", error);
            exit(1);
        }
    }
    if (strcmp(pathname,OLDNAME)==0) pathname = NEWNAME;
    fprintf(stderr, "opening: %s\n", pathname);
    return real_open(pathname, flags, mode);
}

Compilez-le avec gcc -Wall -O2 -fpic -shared -ldl -o shim_open.so shim_open.c et testez-le en mettant quelque chose dans /tmp/myadb.log et exécutantLD_PRELOAD=/.../shim_open.so cat /tmp/adb.log . Ensuite, essayez le LD_PRELOAD sur adb.


Voici un exemple très simple d'utilisation de util-linux est unshare pour placer un processus dans un espace de noms de montage privé et lui donner une vue différente du même système de fichiers que son parent possède actuellement :

{   cd /tmp                      #usually a safe place for this stuff
    echo hey   >file             #some
    echo there >file2            #evidence
    sudo unshare -m sh -c '      #unshare requires root by default
         mount -B file2 file     #bind mount there over hey
         cat file                #show it
         kill -TSTP "$$"         #suspend root shell and switch back to parent
         umount file             #unbind there
         cat file'               #show it
    cat file                     #root shell just suspended
    fg                           #bring it back
    cat file2                    #round it off
}
there                            #root shell
hey                              #root shell suspended
hey                              #root shell restored
there                            #rounded

Vous pouvez donner à un processus une vue privée de son système de fichiers avec le unshare utilitaire sur les systèmes Linux à jour, bien que la fonction d'espace de noms de montage elle-même ait été assez mature pour toute la série de noyaux 3.x. Vous pouvez entrer des espaces de noms préexistants de toutes sortes avec nsenter utilitaire du même package, et vous pouvez en savoir plus avec man .


Linux
  1. Linux - Est-il possible de simuler un chemin spécifique pour un processus ?

  2. Trouver le fichier journal de Firefox ?

  3. Meilleur outil de surveillance des fichiers journaux pour le serveur Ubuntu ?

  4. Comment configurer Sudo sans mot de passe pour un utilisateur spécifique

  5. Comment définir l'ID de processus sous Linux pour un programme spécifique

8 commandes de navigation de fichiers Linux essentielles pour les nouveaux utilisateurs

Comment afficher le résultat de grep avec le chemin complet ou le nom de fichier

grep récursivement pour un type de fichier spécifique sous Linux

syntaxe du fichier de configuration logrotate - plusieurs entrées génériques possibles ?

Rotation du journal de stdout ?

créer un fichier journal