Dodanie katalogu do $ PATH w CentOS?

84

Właśnie uruchomiliśmy nasze nowe serwery i uruchomiliśmy na nich CentOS. Po pomyślnym zainstalowaniu Ruby Enterprise Edition, chciałbym teraz dodać /usr/lib/ruby-enterprise/binkatalog REE / bin (znajdujący się w ), aby stał się domyślnym interpreterem Ruby na serwerze.

Próbowałem następujących, które dodają go tylko do bieżącej sesji powłoki:

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

Jakie byłoby właściwe podejście do trwałego dodania tego katalogu do $ PATH dla wszystkich użytkowników . Jestem aktualnie zalogowany jako root.

Z góry dziękuję!

vonconrad
źródło

Odpowiedzi:

115

Edycja /etc/profiletakich rzeczy nie jest dobrym pomysłem , ponieważ stracisz wszystkie zmiany, gdy CentOS opublikuje aktualizację tego pliku. Właśnie po to /etc/profile.djest:

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

Zaloguj się ponownie i ciesz się (bezpiecznie) zaktualizowaną ŚCIEŻKĄ:

# 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

Zamiast ponownie się logować, możesz ponownie załadować profil:

# . /etc/profile

Spowoduje to zaktualizowanie $PATHzmiennej.

Mikrofon
źródło
1
~/.profilejest również inną prawidłową opcją
Zypher
4
Tak, dla jednego użytkownika. Pytanie dotyczyło jednak zmiany PATH dla wszystkich użytkowników.
Mike
2
@Mike Co to jest polecenie pathmunge?
Nickolai Leschov
@NickolaiLeschov Jestem prawie pewien, że po prostu dołącza ścieżkę do $ PATH.
Mike
@NickolaiLeschov to funkcja zdefiniowana w / etc / profile
CrazyPheel
11

Po zapoznaniu się z radą fmonka sprawdziłem /etc/bashrc, gdzie zauważyłem, że „Środowisko działa w / etc / profile”. Poszedłem do środka /etc/profile, zobaczyłem to:

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

Aby rozwiązać mój problem, po prostu dodałem pathmunge /usr/lib/ruby-enterprise/binpod instrukcją if. To rozwiązało mój problem.

vonconrad
źródło
Czy ktoś mógłby wyjaśnić, co "$EUID" = "0"oznacza w tym kontekście?
Eli
EUID 0 oznacza, że ​​użytkownik jest rootem.
bbaja42
6
Powinieneś był użyć /etc/profile.d. Zobacz moją odpowiedź poniżej.
Mike
Rozważ zaakceptowanie odpowiedzi @MikeConigliaro jako poprawnej. Jego droga jest właściwa. Został opracowany do pracy w ten sposób. Spójrz na pliki w /etc/profile.d/folderze, a zauważysz. Ponadto, jak powiedział, aktualizacja systemu może cofnąć twoje rozwiązanie.
Caio Cunha,
4

„Interaktywna powłoka logowania jest uruchamiana po udanym logowaniu przy użyciu / bin / login poprzez odczytanie pliku / etc / passwd. To wywołanie powłoki zwykle odczytuje / etc / profile i jego prywatny odpowiednik ~ / .bash_profile po uruchomieniu.

Interaktywna powłoka niezalogowana jest zwykle uruchamiana z wiersza poleceń za pomocą programu powłoki (np. [Monit] $ / bin / bash) lub za pomocą polecenia / bin / su. Interaktywna powłoka niezalogowana jest również uruchamiana z programem terminalowym, takim jak xterm lub konsola, w środowisku graficznym. Ten typ wywołania powłoki zwykle kopiuje środowisko nadrzędne, a następnie odczytuje plik ~ / .bashrc użytkownika w celu uzyskania dodatkowych instrukcji konfiguracji uruchamiania. ” Http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html

Dlatego nie umieszczałbym zmiennych środowiskowych w bashrc, ponieważ jest to nie tylko sprzeczne z powszechną konwencją, ale również przegapisz swoje zmienne bashrc podczas wywoływania terminala ze środowiska graficznego pulpitu.

Na Redhat w /etc/profileI znalazłem ten komentarz:

„Aliasy systemowe i funkcje powinny znajdować się w / etc / bashrc. Osobiste zmienne środowiskowe i programy startowe powinny znajdować się w ~ / .bash_profile. Osobiste aliasy i funkcje powinny znajdować się w ~ / .bashrc.”

Jeśli więc chcesz ustawić zmienne środowiskowe dla poszczególnych użytkowników, zrób to w pliku .bash_profile użytkownika.

Wracając do .bash_profileI czytam:

„Osobiste zmienne środowiskowe i programy startowe.

Aliasy i funkcje osobiste powinny znajdować się w ~ / .bashrc. Systemowe zmienne środowiskowe i programy startowe znajdują się w / etc / profile. Systemowe aliasy i funkcje znajdują się w / etc / bashrc. ”

Wniosek
Jeśli chcesz, aby tylko root widział programy rezydujące, na przykład w / sbinI dodałbym tę ścieżkę do .bash_profilepliku roota . Ale jeśli chcesz, każdy użytkownik, aby zobaczyć co korzeń specyficzne programy są zainstalowane na skrzynce chciałbym umieścić /sbinna /etc/.profile. Teraz każdy użytkownik może korzystać z funkcji uzupełniania tabulatorów, aby wyszukiwać programy root i w razie potrzeby podnosić uprawnienia.

Przypadek specjalny: SSH
Kiedy ssh jest uruchamiany z linii poleceń, uruchamiana jest interaktywna powłoka logowania. Ale w tym przypadku /etc/profilenie jest czytany. Kiedy zdefiniowałem zmienne środowiskowe w .bash_profilepliku każdego użytkownika, pracował z ssh.

pola siatkowe
źródło
2

SORRY błędnie zinterpretował pytanie, które brzmi następująco: profil UŻYTKOWNIKA pozostawia to na wypadek, gdyby pomógł komuś

zmodyfikuj .bash_profile

nano ~/.bash_profile

następnie gdzieś w pliku dodaj / zmodyfikuj ścieżki oddzielone:

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

następnie załaduj ponownie swój profil

source ~/.bash_profile

lub wyloguj się i zaloguj ponownie

jeśli zaznaczysz ŚCIEŻKĘ, powinna ona zawierać nowo dodane ścieżki

echo $PATH
GiorgosK
źródło
1

Możesz ustawić zmienne środowiskowe w pliku .rc; dla powłok bash (uważam, że najczęściej i domyślnie w CentOS) każdy użytkownik ma plik o nazwie .bashrc w swoim katalogu domowym.

Dodaj polecenie PATH = / usr / lib / ruby-enterprise / bin: $ PATH do tego pliku, aby ustawić go dla konkretnego użytkownika.

Aby ustawić go dla wszystkich użytkowników (jak wspomniałeś), zmień go w / etc / bashrc (domyślny plik .bashrc w katalogu domowym każdego użytkownika powinien ten plik źródłowy źródłowy, ale powinieneś go dwukrotnie sprawdzić).


źródło