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!

vonconrad
quelle

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 .

Mike
quelle
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.

vonconrad
quelle
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.

Maschenfelder
quelle
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
GiorgosK
quelle
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).


quelle