2010-01-15 2 views

Antwort

0

eine alternative Art und Weise

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

Dies wird fehlschlagen, wenn z.B. LDAP-Authentifizierung wird verwendet. –

+0

Sie möchten 'getent passwd ' verwenden. Das wird verwenden, was auch immer Name Service Switch-Datenbanken in /etc/nsswitch.conf konfiguriert sind (zB:/etc/passwd, nis, ldap, etc). –

1

Tilde (~) es ist das gleiche wie $ HOME so, nicht alle Benutzer als root zu Hause das gleiche Verzeichnis haben.

Aber wenn Sie darauf bestehen, die Tilde in mit diesem die Arbeit machen:

echo ~/../$NAME 

See:

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

Dies setzt voraus, dass die Home-Verzeichnisse aller Benutzer, einschließlich der aktuellen, Geschwister sind. Dies wird besonders spektakulär ausfallen, wenn der aktuelle Benutzer "root" ist. –

+0

yeap, das ist was ich in der Antwort schreibe ... – OscarRyz

+0

Keine Garantien, auch wenn nicht root. Zum Beispiel werden Häuser auf CMUs Andrew nach dem Muster '/afs/andrew.cmu.edu/usr ##/$ LOGNAME' ausgegeben, wobei' ## 'eine halb-zufällige ganze Zahl ist. – ephemient

1

Interessante Unterschied zwischen bash und csh, wo ~ $ VARNAME tatsächlich tut, was man erwarten von!

Dies ist hässlich, aber es scheint in bash zu arbeiten:

homedir=`eval "echo ~$USERNAME"` 

Jetzt homedir $ hält das mit $ NUTZERNAME zugeordnet Home-Verzeichnis.

+0

Das ist in der Tat die Art, es in bash zu tun. Die Tilde-Erweiterung findet vor der Parametererweiterung statt, so dass die Shell tatsächlich versucht, ~ $ USERNAME in das Ausgangsverzeichnis eines Benutzers zu expandieren, dessen Name buchstäblich $ USERNAME ist, und nicht den Inhalt von $ USERNAME. – Wilson

+2

Stellen Sie nur sicher, dass '$ USERNAME' zuerst bereinigt wird und keine Inhalte wie' 'enthält; sudo rm -rf/', 'kay? – ephemient

+1

@ephemient: Guter Rat! Ich bin überrascht, dass "Little Bobby Tables" noch nicht aufgetaucht ist! –

6

Wenn Sie Zugang zu getent:

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

Safer:

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

Hier ist die %q Option printf Zitate und entkommt gefährliche Zeichen.

Wenn $NAME ist Joe, würden Sie etwas wie /home/joe bekommen. Für root erhalten Sie möglicherweise /root. Für "abc; rm something" würdest du "~ abc; rm something" bekommen, anstatt etwas entfernt zu haben.

+0

+1 für die Lösung. Auch geringfügiger Tippfehler: sollte keinen gravierenden Akzent haben. Sollte eval sein HOMEDIRECTORY = "$ (printf" ~% q "" $ NAME ")" –

+0

Danke. Tippfehler behoben. –

+0

Ich mag diese Lösung, weil sie Probleme mit 'eval' überwindet und ordentlich, sauber, leicht zu lesen und leicht zu debuggen ist. Vielen Dank. –

1

METHODE BEST

erforderlich: nichts (N. B.Dies ist die gleiche Technik wie getent ohne getent) zu erfordern

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 METHOD FOR ROOT LINUX

Required: Linux, root (oder Sudo)

LÖSUNG FÜR COMPLETE EXPANSION

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.$$ 
} 

Beispiel Nutzung:

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

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

VERFAHREN ZUR CSH NUTZEN

Dies ist ein BASH-Skript wird, ruft es nur csh.

erforderlich: 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. 

VERFAHREN DESPERATION

erforderlich: Finger (veraltet)

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 

können Sie kombiniert die grep Operation in sed, aber da diese Methode sucky ist, würde ich nicht stören.

+1

Es ist nicht dasselbe wie 'getent', da nicht alle Benutzer in '/ etc/passwd' gespeichert sind. –

+0

Dies wäre hilfreich für Mac OS X, da nicht alle Benutzer in/etc/password gespeichert sind. Mac OS X wird jedoch nicht mit getent ausgeliefert, was einen strittigen Punkt darstellt. – Orwellophile

Verwandte Themen