Mam aplikację, która czyta plik. Nazwijmy to nazwa procesu i plik ~ / .configuracja . Po uruchomieniu nazwa procesu zawsze odczytuje konfigurację ~ / .configuracja i nie może być skonfigurowana inaczej. Istnieją również inne aplikacje, które polegają na „~ / .configuration”, przed i po, ale nie podczas działania nazwy procesu .
Zawijanie nazwy procesu w skrypcie, który zastępuje zawartość ~ / .configuracja, jest opcją, ale ostatnio miałem awarię zasilania (podczas gdy zawartość została zamieniona), w której straciłem poprzednią zawartość tego pliku, więc nie jest to pożądane.
Czy istnieje sposób (być może użycie czegoś odległego LD_DEBUG=files processname
?), Aby oszukać proces czytania różnych treści podczas próby odczytania określonego pliku? Wyszukiwanie i zastępowanie nazwy pliku w pliku wykonywalnym jest nieco zbyt inwazyjne, ale powinno również działać.
Wiem, że można napisać moduł jądra, który przejmuje open()
połączenie ( https://news.ycombinator.com/item?id=2972958 ), ale czy istnieje prostszy czy czystszy sposób?
EDYCJA: Podczas wyszukiwania ~ / .configuracji w pliku wykonywalnym nazwy procesu odkryłem, że próbował odczytać inną nazwę pliku tuż przed odczytaniem ~ / .configuracji . Problem rozwiązany.
źródło
LD_PRELOAD
lub FUSE, jak w przypadku tego nieco podobnego problemu , ale nie znam żadnej istniejącej implementacji.Odpowiedzi:
W ostatnich wersjach Linuksa, można cofnąć udostępnianie nazw zamontować . Oznacza to, że można uruchomić procesy, które inaczej wyświetlają wirtualny system plików (z odmiennie zamontowanymi systemami plików).
Można to również zrobić
chroot
, aleunshare
jest bardziej dostosowane do twojej sprawy.Jak
chroot
trzeba superużytkownika uprzywilejowane dounshare
przestrzeni nazw Górze.Powiedzmy, że masz
~/.configuration
i~/.configuration-for-that-cmd
pliki.Możesz rozpocząć proces, dla którego
~/.configuration
jest to naprawdę bind-mount~/.configuration-for-that-cmd
, i wykonaćthat-cmd
tam.lubić:
that-cmd
i wszystkie jego procesy potomne będą wyglądały inaczej~/.configuration
.that-cmd
powyżej będzie działać jakoroot
, użyj,sudo -u another-user that-cmd
jeśli trzeba uruchomić jako inny użytkownik .źródło
/test
i działało bez problemu.Miękkie linki.
Utwórz dwa pliki konfiguracji i wskaż jeden z nich miękkim łączem przez większość czasu, ale zmień miękkie łącze, aby wskazywało na inny, gdy uruchomiona jest specjalna aplikacja.
(Wiem, że to okropny hack, ale jest nieco bardziej niezawodny niż zmiana zawartości pliku).
Lub manipuluj $ HOME.
W skrypcie, który rozpoczyna denerwujący proces, ustaw $ HOME na coś w zwykłym katalogu $ HOME, a twoja aplikacja powinna następnie użyć pliku konfiguracyjnego znajdującego się tam (przetestowany i działa dla podstawowych poleceń powłoki, ~ rozwija się do $ HOME).
W zależności od tego, co jeszcze robi ten proces, zmiana $ HOME może mieć niezamierzone konsekwencje (np. Pliki wyjściowe mogą skończyć w niewłaściwym miejscu).
źródło
Możesz to zrobić za pomocą sztuczki LD_PRELOAD . Oto implementacja, która mapuje ścieżki zaczynające się od określonego prefiksu do innej lokalizacji. Kod znajduje się również na github .
Na przykład, możesz sfałszować istnienie pliku
/etc/
bez rootowania. Było to konieczne dla klienta owncloud, który odmawia działania, gdy plik/etc/ownCloud/sync-exclude.list
nie istnieje.Działa poprzez zastąpienie funkcji
open()
i,open64()
aby zamapować jeden katalog do drugiego, na przykład wszystkieopen()
wywołania, do/etc/ownCloud/...
których można przekierować/home/user1/.etc/ownCloud/...
.Po prostu dostosuj
path_map
, a następnie skompiluj i uruchom swój program ze wstępnie załadowaną biblioteką lib:Kod źródłowy
path-mapping.c
:źródło