2010-01-15 15 views

Odpowiedz

0

jeden alternatywny sposób

awk -F":" '{print "user: "$1", Home directory is: "$6}' /etc/passwd 
+1

Nie powiedzie się, jeśli np. Użyto autoryzacji LDAP. –

+0

Chcesz użyć 'getent passwd '. To spowoduje, że wszystkie bazy danych Switch Switch zostaną skonfigurowane w pliku /etc/nsswitch.conf (np .:/etc/passwd, nis, ldap, etc). –

1

tyldy (~) jest taka sama jak $ HOME więc nie wszystkie użytkownik będzie miał jako root do domu tym samym katalogu.

Ale jeśli upierasz się przy użyciu tyldy to zrobić pracę:

echo ~/../$NAME 

Patrz:

$ pwd 
/home/oreyes 
$ export NAME=john 
$ export DIRECTORYNAME=~/../$NAME 
$ cd $DIRECTORYNAME 
$ pwd 
/home/john 
+1

Zakłada to, że katalogi domowe wszystkich użytkowników, w tym bieżący, są rodzeństwem. To nie zadziała szczególnie spektakularnie, jeśli bieżącym użytkownikiem jest root. –

+0

yeap, to jest to, co piszę w odpowiedzi ... – OscarRyz

+0

Brak gwarancji, nawet jeśli nie jest rootem. Na przykład, domy na Andrew CMU są wydawane według wzoru '/afs/andrew.cmu.edu/usr ##/$ LOGNAME', gdzie' ## 'jest pół-losową liczbą całkowitą. – ephemient

1

Ciekawa różnica między bash i csh, gdzie ~ $ VARNAME faktycznie robi to, czego chcesz oczekiwać!

To jest brzydki, ale wydaje się działać w bash:

homedir=`eval "echo ~$USERNAME"` 

Teraz $ homedir posiada katalog domowy powiązany z $ username.

+0

To jest rzeczywiście sposób, aby zrobić to w bash. Ekspansja tyldy następuje przed rozwinięciem parametrów, więc powłoka faktycznie próbuje rozszerzyć ~ $ USERNAME do katalogu domowego użytkownika, którego nazwa to dosłownie $ USERNAME, a nie zawartość $ USERNAME. – Wilson

+2

Upewnij się, że '$ USERNAME' jest najpierw odkażany i nie zawiera rzeczy takich jak'; sudo rm -rf/', 'kay? – ephemient

+1

@ephemient: Dobra rada! Jestem zaskoczony, że "małe stoły Bobby" jeszcze się nie pojawiły! –

6

Jeśli masz dostęp do getent:

getent passwd "$NAME" | cut -d: -f 6 
15

Bezpieczny:

eval HOMEDIRECTORY="$(printf "~%q" "$NAME")" 

Tutaj %q opcję printf cytaty i ucieka niebezpieczne znaki.

Jeśli $NAME Joe, można dostać coś takiego /home/joe. W przypadku root-a możesz uzyskać /root. Dla "abc; rm something" dostaniesz "~ abc; rm something" zamiast mieć coś usuniętego.

+0

+1 dla rozwiązania. Również drobna literówka: nie powinna mieć ciągłego akcentu. Powinien być eval HOMEDIRECTORY = "$ (printf" ~% q "" $ NAME ")" –

+0

Dzięki. Naprawiono literówkę. –

+0

Podoba mi się to rozwiązanie, ponieważ pokonuje problemy z 'eval' i jest schludne, czyste, łatwe do odczytania i łatwe do debugowania. Dzięki. –

1

NAJLEPSZY SPOSÓB

Wymagane: nic (nbJest to ta sama technika jak getent bez konieczności getent)

home() { # returns empty string on invalid user 
    grep "^$1:" /etc/passwd | cut -d ':' -f 6 
} 

# grep "^$user:" /etc/passwd | cut -d ':' -f 6 
/var/lib/memcached 

NICE METODA głównej systemu Linux

Wymagane Linux, korzeń (lub sudo)

home() { # returns errorlevel 1 on invalid user 
    su "$1" -s '/bin/sh' -c 'echo $HOME' 
} 

# su memcached -s '/bin/sh' -c 'echo $HOME' 
/var/lib/memcached 

ROZWIĄZANIE DLA dokończenia ekspansji

magic() { # returns unexpanded tilde express on invalid user 
    local _safe_path; printf -v _safe_path "%q" "$1" 
    eval "ln -sf $_safe_path /tmp/realpath.$$" 
    readlink /tmp/realpath.$$ 
    rm -f /tmp/realpath.$$ 
} 

Przykład wykorzystania:

$ magic ~nobody/would/look/here 
/var/empty/would/look/here 

$ magic ~invalid/this/will/not/expand 
~invalid/this/will/not/expand 

metoda wykorzystanie CSH

Jest to skrypt powłoki, to po prostu wywołuje csh.

Wymagane: csh

home() { # return errorlevel 1 on invalid user 
    export user=$1; csh -c "echo ~$user" 
} 

$ export user=root; csh -c "echo ~$user" 
/var/root 

$ export user=nodfsv; csh -c "echo ~$user" 
Unknown user: nodfsv. 

METODA desperacji

Wymagane: palec (przestarzałe)

home() { 
    finger -m "$1" | 
    grep "^Directory:" | 
    sed -e 's/^Directory: //' -e 's/ .*//' 
} 

# finger -m "haldaemon" | 
> grep "^Directory:" | 
> sed -e 's/^Directory: //' -e 's/ .*//' 
/home/haldaemon 

można łączyć z grep operacja w sed, ale ponieważ ta metoda jest sucky, nie zawracałbym sobie głowy.

+1

To nie to samo co 'getent', ponieważ nie wszyscy użytkownicy są zapisani w'/etc/passwd'. –

+0

Jest to przydatne w systemie Mac OS X, ponieważ nie wszyscy użytkownicy są zapisani w/etc/password. Jednak Mac OS X nie jest dostarczany z getent, co czyni go punktem spornym. – Orwellophile

Powiązane problemy