Mam USERzmienną w swoim skrypcie i chcę zobaczyć jego HOMEścieżkę na podstawie tej USERzmiennej. Jak mogę to zrobić?
Mam USERzmienną w swoim skrypcie i chcę zobaczyć jego HOMEścieżkę na podstawie tej USERzmiennej. 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/passwdLDAP, 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
~fooze 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ć, evalaby 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.
evaljest potrzebne. Bash nie przetwarza ~foopo rozwinięciu zmiennej.
USER.
$USERrozwija 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, getentzwró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 USERhasło lub jeśli USERnie ma hasła, następująca opcja jest następująca:
su -c 'echo ~' ${USER}
W przypadku standardowego suzachowania, jeśli USERjest niezdefiniowany lub pusty, wówczas suspróbuje uruchomić polecenie jako root.
Jeśli wartość USERnie 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.