Mam USER
zmienną w swoim skrypcie i chcę zobaczyć jego HOME
ścieżkę na podstawie tej USER
zmiennej. Jak mogę to zrobić?
Mam USER
zmienną w swoim skrypcie i chcę zobaczyć jego HOME
ścieżkę na podstawie tej USER
zmiennej. Jak mogę to zrobić?
Odpowiedzi:
Istnieje narzędzie, które wyszukuje informacje o użytkowniku niezależnie od tego, czy są one przechowywane w lokalnych plikach, takich jak /etc/passwd
LDAP, czy w innej metodzie. To się nazywa getent
.
Aby uzyskać z niego informacje o użytkowniku, uruchamiasz getent passwd $USER
. Otrzymasz linię, która wygląda następująco:
[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash
Teraz możesz po prostu wyciąć z niego katalog domowy, np. Używając cut, tak:
[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
~foo
ze zmiennymi w bash
. W każdym razie nie bezpośrednio.
~
wydaje się kartę rozwinąć, choć i inny spec''d zachowanie przedrostkiem tyldy zostaje zastąpiony przez ścieżkę początkowego katalogu roboczego związanego z nazwą logowania uzyskanych przy użyciu getpwnam()
funkcji i tak pewnie, że wyszukiwanie jest całkiem dobry. Jednak nie lubię rozszerzeń tabulatorów - lubię pisać tabulatory.
Możesz użyć, eval
aby uzyskać czyjś katalog domowy.
eval echo "~$USER"
To działa na pewno przynajmniej dla lokalnych użytkowników. Nie wiem, czy zdalni użytkownicy, tacy jak LDAP, są obsługiwani eval
.
eval
jest potrzebne. Bash nie przetwarza ~foo
po rozwinięciu zmiennej.
USER
.
$USER
rozwija się do zaledwie jednym ciągiem znaków alfabetycznych.
Zwykle jest to miejsce /home/$USER
, ale to nie musi być uniwersalne. Ostateczne miejsce wyszukiwania takich informacji znajduje się w pliku /etc/passwd
.
Ten plik jest czytelny na całym świecie (każdy może go przeczytać), więc każdy użytkownik ma dostęp do jego zawartości.
Jeśli w pliku istnieje US $, pozycja poprzedzająca przedostatnia to katalog HOME użytkownika.
Spowoduje to wybranie wpisu i wydrukowanie katalogu HOME:
awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"
W przypadku bardziej złożonych (zdalnych) systemów getent jest zwykłą komendą do uzyskiwania informacji o użytkownikach z systemu NSS (bibliotek usług przełączania nazw).
Polecenie
echo $(getent passwd $USER )| cut -d : -f 6
Dostarczy równoważne informacje (jeśli są dostępne).
Jeśli użytkownik nie istnieje, getent
zwróci błąd.
Oto mała funkcja powłoki, która nie ignoruje kodu wyjścia getent
:
get_home() {
local result; result="$(getent passwd "$1")" || return
echo $result | cut -d : -f 6
}
Oto przykład użycia:
da_home="$(get_home missing_user)" || {
echo 'User does NOT exist!'; exit 1
}
# Now do something with $da_home
echo "Home directory is: '$da_home'"
Jeśli jesteś zalogowany jako root, znasz USER
hasło lub jeśli USER
nie ma hasła, następująca opcja jest następująca:
su -c 'echo ~' ${USER}
W przypadku standardowego su
zachowania, jeśli USER
jest niezdefiniowany lub pusty, wówczas su
spróbuje uruchomić polecenie jako root.
Jeśli wartość USER
nie jest prawidłowa nazwa użytkownika, a następnie odpowiedni błąd zostanie podniesiona: su: user <user> does not exist
.
Jest tu już wiele dobrych odpowiedzi, ale to może komuś pomóc.