Ich habe eine Anwendung, die eine Datei liest. Nennen wir es Prozessname und die Datei ~ / .configuration . Wenn der Prozessname ausgeführt wird , lautet er immer ~ / .configuration und kann nicht anders konfiguriert werden. Es gibt auch andere Anwendungen, die vor und nach "~ / .configuration" auf "~ / .configuration" angewiesen sind, jedoch nicht, während der Prozessname ausgeführt wird.
Wrapping Process in ein Skript, das den Inhalt von ~ / .configuration ersetzt, ist eine Option, aber ich hatte kürzlich einen Stromausfall (während der Inhalt ausgetauscht wurde), bei dem ich den vorherigen Inhalt dieser Datei verloren habe, sodass dies nicht wünschenswert ist.
Gibt es einen Weg (vielleicht mit etwas in der Ferne verwandt LD_DEBUG=files processname
tun?), Einen Prozess zum Lesen verschiedener Inhalte zu verleiten, wenn er versucht, eine bestimmte Datei zu lesen? Das Suchen und Ersetzen des Dateinamens in der ausführbaren Datei ist etwas zu invasiv, sollte aber auch funktionieren.
Ich weiß, dass es möglich ist, ein Kernelmodul zu schreiben, das den open()
Aufruf übernimmt ( https://news.ycombinator.com/item?id=2972958 ), aber gibt es einen einfacheren oder saubereren Weg?
BEARBEITEN: Bei der Suche nach ~ / .configuration in der ausführbaren Datei des Prozessnamens habe ich festgestellt, dass kurz vor dem Lesen von ~ / .configuration versucht wurde, einen anderen Dateinamen zu lesen . Problem gelöst.
quelle
LD_PRELOAD
oder FUSE erfolgen, wie bei diesem etwas ähnlichen Problem , aber ich kenne keine vorhandene Implementierung.Antworten:
In neueren Linux-Versionen können Sie den Mount-Namespace freigeben . Das heißt, Sie können Prozesse starten, die das virtuelle Dateisystem unterschiedlich anzeigen (wobei Dateisysteme unterschiedlich bereitgestellt werden).
Das kann auch gemacht werden
chroot
, ist aberunshare
besser auf Ihren Fall abgestimmt.Wie
chroot
müssen Sie Superuser priviledgedunshare
Namensraum montieren.Sagen wir also, Sie haben
~/.configuration
und~/.configuration-for-that-cmd
Dateien.Sie können dort einen Prozess starten, für den
~/.configuration
es sich tatsächlich um einen Bind-Mount handelt~/.configuration-for-that-cmd
, und dort ausführenthat-cmd
.mögen:
that-cmd
und alle seine Nachkommenprozesse werden einen anderen sehen~/.configuration
.that-cmd
oben wird ausgeführt alsroot
, verwendensudo -u another-user that-cmd
Sie , wenn es als ein anderer Benutzer ausgeführt werden muss .quelle
/test
und es hat ohne Probleme funktioniert.Softlinks.
Erstellen Sie zwei Konfigurationsdateien und zeigen Sie die meiste Zeit mit einem Softlink auf eine davon. Ändern Sie den Softlink jedoch so, dass er auf die andere zeigt, wenn die spezielle App ausgeführt wird.
(Ich weiß, dass dies ein schrecklicher Hack ist, aber er ist etwas zuverlässiger als das Ändern des Dateiinhalts).
Oder manipulieren Sie $ HOME.
Stellen Sie in dem Skript, das den nervigen Prozess startet, $ HOME so ein, dass es sich im regulären $ HOME-Verzeichnis befindet, und Ihre App sollte dann die dort befindliche Konfigurationsdatei verwenden (getestet und funktioniert für grundlegende Shell-Befehle, ~ wird auf $ HOME erweitert).
Je nachdem, was der Prozess sonst noch tut, kann das Ändern von $ HOME unbeabsichtigte Folgen haben (dh Ausgabedateien landen möglicherweise am falschen Ort).
quelle
Sie können dies mit dem Trick LD_PRELOAD tun . Hier ist eine Implementierung, die Pfade, die mit einem bestimmten Präfix beginnen, einem anderen Speicherort zuordnet. Der Code ist auch auf Github .
Sie können beispielsweise die Existenz einer Datei vortäuschen,
/etc/
ohne root zu sein. Dies war für den owncloud-Client erforderlich, der sich weigert zu arbeiten, wenn die Datei/etc/ownCloud/sync-exclude.list
nicht vorhanden ist.Es funktioniert, indem die Funktionen
open()
und überschriebenopen64()
werden, um ein Verzeichnis einem anderen zuzuordnen. Beispielsweise könnten alleopen()
Aufrufe an/etc/ownCloud/...
umgeleitet werden/home/user1/.etc/ownCloud/...
.Passen Sie einfach das an
path_map
, kompilieren Sie Ihr Programm und führen Sie es mit der vorinstallierten Bibliothek aus:Quellcode von
path-mapping.c
:quelle