Hinzufügen eines Verzeichnisses zu $ ​​PATH in CentOS?


84

Wir haben gerade unsere neuen Server hochgefahren und führen CentOS auf allen aus. Nach der erfolgreichen Installation von Ruby Enterprise Edition möchte ich nun das /usr/lib/ruby-enterprise/binVerzeichnis REE / bin (im Verzeichnis) hinzufügen , um es zum Standard-Ruby-Interpreter auf dem Server zu machen.

Ich habe Folgendes ausprobiert, wodurch es nur der aktuellen Shell-Sitzung hinzugefügt wird:

export PATH=/usr/lib/ruby-enterprise/bin:$PATH

Was wäre der richtige Ansatz sein , um dauerhaft für dieses Verzeichnis $ PATH Hinzufügen aller Benutzer . Ich bin derzeit als root angemeldet.

Danke im Voraus!

Antworten:


116

Es ist keine gute Idee, /etc/profileÄnderungen an solchen Objekten vorzunehmen, da Sie alle Änderungen verlieren, wenn CentOS ein Update für diese Datei veröffentlicht. Genau dafür /etc/profile.dist vorgesehen:

# echo 'pathmunge /usr/lib/ruby-enterprise/bin' > /etc/profile.d/ree.sh
# chmod +x /etc/profile.d/ree.sh

Loggen Sie sich wieder ein und genießen Sie Ihren (sicher) aktualisierten PFAD:

# echo $PATH
/usr/lib/ruby-enterprise/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
# which ruby
/usr/lib/ruby-enterprise/bin/ruby

Anstatt sich erneut anzumelden, können Sie das Profil neu laden:

# . /etc/profile

Dadurch wird die $PATHVariable aktualisiert .


1
~/.profileist eine andere gültige Option auch
Zypher

4
Ja, für einen einzelnen Benutzer. Es ging jedoch darum, den Pfad für alle Benutzer zu ändern .
Mike

2
@Mike Was ist dieser pathmunge Befehl?
Nickolai Leschov

@NickolaiLeschov Ich bin mir ziemlich sicher, dass es nur einen Pfad zu $ ​​PATH anfügt.
Mike

@NickolaiLeschov es ist eine Funktion, die in / etc / profile definiert ist
CrazyPheel

11

Nachdem ich den Ratschlägen von fmonk gefolgt war, habe ich mich umgesehen und /etc/bashrcfestgestellt, dass "Umgebungsmaterial in / etc / profile abgelegt wird ". Ich schaute hinein /etc/profileund sah folgendes:

pathmunge () {
    if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then
       if [ "$2" = "after" ] ; then
          PATH=$PATH:$1
       else
          PATH=$1:$PATH
       fi
    fi
}

[...]

# Path manipulation
if [ "$EUID" = "0" ]; then
    pathmunge /sbin
    pathmunge /usr/sbin
    pathmunge /usr/local/sbin
fi

Um mein Problem zu lösen, habe ich einfach pathmunge /usr/lib/ruby-enterprise/binunter der if-Anweisung hinzugefügt . Dies löste mein Problem.


Könnte jemand erklären, was das "$EUID" = "0"in diesem Zusammenhang bedeutet?
Eli

EUID 0 bedeutet, dass der Benutzer root ist.
bbaja42

6
Sie sollten /etc/profile.d verwendet haben. Siehe meine Antwort unten.
Mike

Bitte erwägen Sie, die Antwort von @MikeConigliaro als richtig zu akzeptieren. Sein Weg ist der richtige. Es wurde so entwickelt, dass es so funktioniert. Schauen Sie sich die Dateien im /etc/profile.d/Ordner an und Sie werden es bemerken. Wie bereits erwähnt, könnte ein Systemupdate Ihre Lösung rückgängig machen.
Caio Cunha

4

"Eine interaktive Anmeldeshell wird nach einer erfolgreichen Anmeldung unter Verwendung von / bin / login durch Lesen der Datei / etc / passwd gestartet. Dieser Shell-Aufruf liest normalerweise / etc / profile und dessen privates Äquivalent ~ / .bash_profile beim Start.

Eine interaktive Shell ohne Anmeldung wird normalerweise über die Befehlszeile mit einem Shell-Programm (z. B. [prompt] $ / bin / bash) oder mit dem Befehl / bin / su gestartet. Eine interaktive Shell ohne Anmeldung wird auch mit einem Terminalprogramm wie xterm oder konsole in einer grafischen Umgebung gestartet. Diese Art des Shell-Aufrufs kopiert normalerweise die übergeordnete Umgebung und liest dann die ~ / .bashrc-Datei des Benutzers, um zusätzliche Anweisungen für die Startkonfiguration zu erhalten. " Http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html

Daher würde ich Umgebungsvariablen nicht in bashrc einfügen, da dies nicht nur gegen die gängigen Konventionen verstößt, sondern Sie auch Ihre bashrc-Variablen vermissen, wenn Sie ein Terminal aus einer grafischen Desktop-Umgebung aufrufen.

Auf Redhat in der /etc/profilefand ich diesen Kommentar:

"Systemweite Aliase und Funktionen sollten in / etc / bashrc abgelegt werden. Persönliche Umgebungsvariablen und Startprogramme sollten in ~ / .bash_profile abgelegt werden. Persönliche Aliase und Funktionen sollten in ~ / .bashrc abgelegt werden."

Wenn Sie Umgebungsvariablen auf Benutzerbasis festlegen möchten, tun Sie dies in der .bash_profile-Datei des Benutzers.

Unterwegs .bash_profilelas ich:

"Persönliche Umgebungsvariablen und Startprogramme.

Persönliche Aliase und Funktionen sollten in ~ / .bashrc abgelegt werden. Systemweite Umgebungsvariablen und Startprogramme befinden sich in / etc / profile. Systemweite Aliase und Funktionen befinden sich in / etc / bashrc. "

Fazit
Wenn nur root Programme sehen soll, die sich im Verzeichnis / sbinI befinden, würde ich diesen Pfad zur root- .bash_profileDatei hinzufügen . Aber wenn Sie jeden Benutzer wollen , was wurzelspezifische Programme zu sehen sind , auf Ihrem System installiert ich setzen würde /sbinin /etc/.profile. Jetzt kann jeder Benutzer mithilfe der Tab-Vervollständigung nach root-spezifischen Programmen suchen und bei Bedarf die Rechte erhöhen.

Sonderfall: SSH
Wenn ssh über eine Befehlszeile gestartet wird, wird eine interaktive Anmeldeshell gestartet. Aber in diesem Fall /etc/profilewird nicht gelesen. Als ich Umgebungsvariablen in der .bash_profileDatei jedes Benutzers definierte, funktionierte es mit ssh.


2

SORRY hat die Frage falsch interpretiert. Die folgende Frage bezieht sich auf das Profil eines BENUTZERS und lässt es für den Fall, dass es jemandem hilft

Ändern Sie .bash_profile

nano ~/.bash_profile

Dann fügen Sie irgendwo in der Datei Ihre Pfade hinzu / ändern Sie sie, getrennt durch:

 PATH=$PATH:$HOME/bin:/your/path
 export PATH

Laden Sie dann Ihr Profil neu

source ~/.bash_profile

oder abmelden und erneut anmelden

Wenn Sie PATH aktivieren, sollten Ihre neu hinzugefügten Pfade darin enthalten sein

echo $PATH

1

Sie können Umgebungsvariablen in einer RC-Datei festlegen. Für Bash-Shells (ich glaube die gebräuchlichste und Standardeinstellung in CentOS) hat jeder Benutzer eine Datei mit dem Namen .bashrc in seinem Ausgangsverzeichnis.

Fügen Sie dieser Datei den Befehl PATH = / usr / lib / ruby-enterprise / bin: $ PATH hinzu, um ihn für einen bestimmten Benutzer festzulegen.

Um es für alle Benutzer festzulegen (wie Sie bereits erwähnt haben), ändern Sie es in / etc / bashrc (die Standardeinstellung .bashrc im Ausgangsverzeichnis jedes Benutzers sollte diese Datei als Quelle haben, aber Sie sollten dies doppelt markieren).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.