2010-01-15 29 views

Trả lời

0

một cách khác

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

Điều này sẽ không thành công nếu ví dụ: LDAP auth được sử dụng. –

+0

Bạn muốn sử dụng 'getent passwd '. Điều đó sẽ sử dụng bất kỳ cơ sở dữ liệu Name Service Switch nào được cấu hình trong /etc/nsswitch.conf (ví dụ:/etc/passwd, nis, ldap, v.v.). –

1

Dấu ngã (~) nó giống như $ HOME như vậy, không phải tất cả người dùng sẽ có như là người chủ nhà cùng thư mục.

Nhưng nếu bạn cứ khăng khăng trong việc sử dụng dấu ngã này làm việc:

echo ~/../$NAME 

Xem:

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

Điều này giả định rằng tất cả thư mục nhà của người dùng, bao gồm thư mục hiện tại, đều là anh chị em. Điều này sẽ thất bại đặc biệt nếu người dùng hiện tại là 'root'. –

+0

yeap, đó là những gì tôi viết trong câu trả lời ... – OscarRyz

+0

Không đảm bảo ngay cả khi không phải root. Ví dụ, ngôi nhà trên Andrew của CMU được đưa ra theo mẫu '/afs/andrew.cmu.edu/usr ##/$ LOGNAME', trong đó' ## 'là một số nguyên bán ngẫu nhiên. – ephemient

1

khác biệt thú vị giữa bash và csh, nơi ~ $ VARNAME thực sự làm những gì bạn muốn chờ đợi!

Đây là xấu xí, nhưng có vẻ như để làm việc trong bash:

homedir=`eval "echo ~$USERNAME"` 

Bây giờ $ homedir giữ thư mục chính gắn liền với $ USERNAME.

+0

Đó thực sự là cách để làm điều đó trong bash. Việc mở rộng dấu ngã xảy ra trước khi mở rộng tham số, do đó, trình bao thực sự cố mở rộng ~ $ USERNAME vào thư mục chính của người dùng có tên theo nghĩa đen là $ USERNAME và không phải là nội dung của $ USERNAME. – Wilson

+2

Chỉ cần đảm bảo rằng '$ USERNAME' được khử trùng trước và không chứa các nội dung như'; sudo rm -rf/', 'kay? – ephemient

+1

@ephemient: Lời khuyên tốt! Tôi ngạc nhiên "ít Bobby Tables" chưa xuất hiện! –

6

Nếu bạn có quyền truy cập vào getent:

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

Safer:

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

Ở đây %q tùy chọn để printf dấu ngoặc kép và thoát nhân vật nguy hiểm.

Nếu $NAME là joe, bạn sẽ nhận được một cái gì đó như /home/joe. Đối với root, bạn có thể nhận được /root. Đối với "abc; rm something" bạn sẽ nhận được "~ abc; rm something" thay vì xóa nội dung nào đó.

+0

+1 cho giải pháp. Ngoài ra, typo nhỏ: không nên có dấu trọng âm. Nên là eval HOMEDIRECTORY = "$ (printf" ~% q "" $ NAME ")" –

+0

Cảm ơn. Typo đã được sửa. –

+0

Tôi thích giải pháp này vì nó vượt qua các vấn đề với 'eval' và gọn gàng, sạch sẽ, dễ đọc và dễ gỡ lỗi. Cảm ơn. –

1

NHẤT PHƯƠNG PHÁP

Yêu cầu: không có gì (n.b., Đây là kỹ thuật tương tự như getent mà không đòi hỏi 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 

PHƯƠNG PHÁP tốt đẹp cho ROOT LINUX

Yêu cầu: Linux, gốc (hoặc 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 

GIẢI PHÁP ĐỂ MỞ RỘNG COMPLETE

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

Ví dụ sử dụng:

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

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

PHƯƠNG PHÁP CHO Tận CSH

Đây là một kịch bản BASH, nó chỉ gọi csh.

Yêu cầu: 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. 

PHƯƠNG PHÁP của sự tuyệt vọng

Yêu cầu: ngón tay (phản đối)

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 

Bạn có thể kết hợp các grep hoạt động vào sed, nhưng vì phương pháp này là sucky, tôi sẽ không bận tâm.

+1

Nó không giống như 'getent' vì không phải tất cả người dùng được lưu trữ trong'/etc/passwd'. –

+0

Điều này sẽ hữu ích cho Mac OS X, bởi vì không phải tất cả người dùng đều được lưu trữ trong/etc/password. Tuy nhiên, Mac OS X không gửi cùng với getent, làm cho nó trở thành điểm moot. – Orwellophile

Các vấn đề liên quan