Sollte ein Paketmanager Ihre .bashrc-Datei ändern?

9

Ich schreibe ein Paket für etwas, für das eine Umgebungsvariable festgelegt werden muss, damit es ordnungsgemäß ausgeführt werden kann. Sollte der Installationsschritt eines Paketmanagers die Umgebung eines Benutzers ändern oder den Benutzer einfach dazu auffordern? Meine Intuition wäre die letztere, aber ich kann Argumente für die erstere sehen.

David Cowden
quelle
7
Können Sie dafür sorgen, dass sich etwas besser verhält, indem Sie die Abhängigkeit von der Umgebungsvariablen entfernen (z. B. stattdessen eine Konfigurationsdatei verwenden)? Das wäre .bashrcmeiner Meinung nach dem Verpacken von Hacks oder dem Mist vorzuziehen .
Sicher, aber sagen wir zum Zweck dieser Frage, dass das Ändern der Anwendung keine Option ist.
David Cowden
1
Was ist, wenn der Benutzer nicht ausgeführt wird bash? Es gibt viele alternative Shells mit einer Vielzahl von Startdateien. Ich schlage ernsthaft vor, hier eine alternative Lösung zu finden.
Jules
10
Schreiben Sie also einen Wrapper darum. Siehe zum Beispiel, tomcatdass mehrere Umgebungsvariablen benötigt werden, um korrekt zu funktionieren. Sie werden alle von einem Startskript festgelegt, das ausgeführt wird, anstatt die Binärdatei direkt auszuführen.
Jules
1
@Vality Ich weiß. Jules 'Vorschlag wurde bereits vorgeschlagen. Ich bin scherzhaft und mache mich über die zirkuläre Logik lustig, um zuerst zu argumentieren, dass ich eine Shell-agnostische Lösung haben sollte, und dann vorzuschlagen, dass ich ein Shell-Skript als Lösung verwende. Es ist ein Witz (;
David Cowden

Antworten:

18

Sollte der Installationsschritt eines Paketmanagers die Umgebung eines Benutzers ändern oder den Benutzer einfach dazu auffordern?

Weder. Paketinstallationsprogramme sollten niemals etwas in einem Home-Verzeichnis für ein Konto berühren, das das Paket nicht besitzt. Pakete sollten sich auch so konfigurieren, dass sie bei Installation ohne besonderen Aufwand des Benutzers verwendet werden können. (Es gibt Ausnahmefälle, in denen Sie dies nicht tun möchten, aber es gibt nur wenige.)

In Unixy-Umgebungen können Konfigurationsdateien abgelegt werden, die gelesen werden, wenn ein Benutzer eine Anmeldeshell startet. Für die Bourne und C - Shells können Sie Ihre Konfiguration in einfügen /etc/profileund /etc/csh.cshrcjeweils. (Vergessen Sie nicht, es bei der Deinstallation zu entfernen.)

Viele Systeme unterstützen dies auch mithilfe einzelner Dateien, wodurch das Hinzufügen und Entfernen von Konfigurationselementen vereinfacht wird, ohne dass Text an einer beliebigen Stelle in einer Datei abgelegt werden muss. (Es bietet Ihnen auch alle Kontroll- und Verantwortlichkeitsvorteile, die Sie von einem Paketmanager erhalten.) Einige Distributionen konfigurieren das /etc/profileLesen aller übereinstimmenden Dateien /etc/profile.d/*.sh.

Blrfl
quelle
1
Historisch gesehen leitet sich derrc Name eines Skripts von CTSSruncom (Run Commands) ab, wurde jedoch seitdem um weitere Bedeutungen erweitert.
Jeffrey Hantin
1
@ JeffreyHantin: Touché. Entfernt.
Blrfl
1
Ich hasse es, weiter zu pflücken, aber es profile.dist nicht in Bash eingebaut, es ist ein Haken, der normalerweise von (normalerweise der Basis der Distribution) bereitgestellt wird/etc/profile . ;)
Jeffrey Hantin
1
@ JeffreyHantin: Richtig, obwohl es keine Kritik an meiner Verwendung des Wortes "Unixy" geben wird. :-)
Blrfl
14

Es ist niemals akzeptabel, die /homeStruktur eines Benutzers über den Paketmanager zu ändern, es sei denn, diese Änderung ist der springende Punkt.

Die wichtigsten Ansätze hierfür sind:

  • Benachrichtigen Sie den Benutzer, den er zum Konfigurieren benötigt.
  • Die Standardeinstellungen für die Lieferung sind nicht erforderlich
  • Packen Sie ein Launcher-Skript, das die Werte entsprechend festlegt
  • (Wenn die Distribution dies unterstützt) Löschen Sie eine Datei, die die Umgebungsvariable exportiert /etc/profile.d. Auf einigen Linux-Systemen werden alle Skripte in diesem Verzeichnis vom Standard-Shell-Setup bezogen, sodass Sie die Variable dort sicher festlegen können.
Daenyth
quelle
7

Frage Sollte der Installationsschritt eines Paketmanagers die Umgebung eines Benutzers ändern?

Antwort Nein. Es ist eine schlechte Idee, die Daten eines Benutzers zu ändern, in diesem Fall die .bashrc-Datei. Benutzerdaten sollten von einem Paketmanager als heilig angesehen werden.

Frage Sollte der Installationsschritt eines Paketmanagers den Benutzer einfach dazu auffordern, dies selbst zu tun?

Antwort Dies ist eine viel schmackhaftere Lösung, aber immer noch nicht ideal.

Ich denke, Sie sollten ein Wrapper-Shell-Skript erstellen, in dem Sie die erforderlichen Umgebungsvariablen festlegen und anschließend die ausführbare Datei ausführen können.

R Sahu
quelle
Ich habe auch über diese Idee nachgedacht. Das Projekt ist jung und wird an einen Punkt gelangen, an dem dies nicht notwendig sein sollte.
David Cowden
@ GlenH7 Ich habe meine Antwort aktualisiert. Hoffentlich ist die aktualisierte Antwort eher die Antwort, die Sie suchen.
R Sahu
@ GlenH7: Diese Frage ist im Wesentlichen ein XY-Problem: meta.stackexchange.com/questions/66377/what-is-the-xy-problem , bei dem der Bedarf an Umgebungsvariablen das eigentliche zu lösende Problem ist.
Whatsisname
Darüber hinaus ist der Vorschlag dieser Antwort, ein Wrapper-Skript zu erstellen, die einzige Antwort, die für alle Shells funktioniert.
Whatsisname
1
@ MattThomason diese Erkenntnis hat mich veranlasst, die Frage tatsächlich zu stellen (;
David Cowden
5

Sie vermissen den Wald vor lauter Bäumen. Natürlich ist es bequemer, die Umgebungsänderung für den Benutzer durchzuführen, aber es ist auch riskanter und etwas invasiver. Sie sollten das Beste aus beiden Welten kombinieren, indem Sie den Benutzer fragen, ob das Installationsprogramm seine ändern soll .bashrc, und ansonsten Anweisungen geben, wie er es selbst tun soll.

Kilian Foth
quelle
Danke für den Hinweis. Ich habe noch nie ein öffentliches Paket geschrieben und möchte nur sicherstellen, dass ich kein Tabu mache.
David Cowden
So geht das Google Cloud SDK heute damit um. Sie werden gefragt, ob Sie Ihre Startdateien ändern möchten.
JMQ
1

Sie gehen davon aus, dass "Benutzer" Singular ist. Was passiert, wenn ich Tausende von Benutzern auf diesem System habe?

Sie gehen davon aus, dass Sie sogar das Home-Verzeichnis des Benutzers finden können. Wenn Benutzer über z. B. LDAP verwaltet werden, können Sie möglicherweise nicht einmal eine Liste aller gültigen Benutzer abrufen. Die Home-Verzeichnisse befinden sich möglicherweise nicht in / home. Sie können dynamisch aus dem Netzwerk bereitgestellt werden. Das Home-Verzeichnis des Benutzers ist möglicherweise verschlüsselt und der Schlüssel ist nicht zugänglich, solange er nicht angemeldet ist.

Es gibt keine Möglichkeit, dies in jeder möglichen Situation zuverlässig zu tun. Verwenden Sie den Mechanismus der Distribution, um Umgebungsvariablen für Benutzer festzulegen, die sich anmelden oder Shells erzeugen. Wenn das nicht funktioniert, schreiben Sie einen Wrapper. (Der Wrapper kann bei Bedarf auch eine Binärdatei sein, um das Argument in Kommentaren zu adressieren.)

pjc50
quelle
0

Das Festlegen einer globalen Variablen in einem Paket ist akzeptabel, wenn es sich um eine Variable handelt, die von Ihrem eigenen Projekt definiert wurde (und das bedeutet, dass der Name des Projekts Teil des Variablennamens ist!). Selbst dann sollten Sie die .bashrcDatei des Benutzers nicht berühren, sondern /etc/profile.d ein Skript hinzufügen .

Idan Arye
quelle