Cách đáng tin cậy để nhận thư mục .ssh của mỗi người dùng từ bash là gì?


8

Tôi có thể phân tích cú pháp / etc / passwd bằng augtool:

myuser=bob
usershome=`augtool -L -A --transform "Passwd incl /etc/passwd" print "/files/etc/passwd/$myuser/home" | sed -En 's/\/.* = (.*)/\1/p'`

... nhưng có vẻ hơi quá phức tạp.

Có công cụ chuyên dụng, đơn giản nào để hiển thị người dùng không (như usermodcó thể được sử dụng để thay đổi nó)?


Bạn đang tìm kiếm một câu trả lời rối?
mgjk

@mgjk Không, tôi biết làm thế nào trên con rối. Trong thực tế, tôi cần câu trả lời này để viết một kịch bản bootstrapping thiết lập một con rối trên một thùng chứa LXC :-)
Adam Ryczkowski

Câu trả lời:


15

Bạn không bao giờ nên phân tích /etc/passwdtrực tiếp. Bạn có thể đang ở trên một hệ thống có người dùng từ xa, trong trường hợp đó họ sẽ không tham gia /etc/passwd. Các /etc/passwdtập tin có thể là một nơi khác. Vân vân.

Nếu bạn cần truy cập trực tiếp vào cơ sở dữ liệu người dùng, hãy sử dụng getent.

$ getent passwd phemmer
phemmer:*:1000:4:phemmer:/home/phemmer:/bin/zsh

$ getent passwd phemmer | awk -F: '{ print $6 }'
/home/phemmer

Tuy nhiên, cũng có một cách khác không liên quan đến phân tích cú pháp:

$ user=phemmer
$ eval echo "~$user"
/home/phemmer

Các ~nhà điều hành trong lớp vỏ mở rộng vào thư mục chính của người dùng chỉ định. Tuy nhiên, chúng ta phải sử dụng evalvì việc mở rộng biến $userxảy ra sau khi mở rộng ~. Vì vậy, bằng cách sử dụng evaldấu ngoặc kép và đôi, bạn thực sự mở rộng $usertrước, sau đó gọi eval echo "~phemmer".

Một khi bạn có thư mục nhà, đơn giản là giải /.sshquyết đến cùng.

$ sshdir="$(eval echo "~$user/.ssh")"
$ echo "$sshdir"
/home/phemmer/.ssh

Câu trả lời tuyệt vời với tất cả sự đánh bóng bao gồm cả awkphép thuật (điều mà tôi chưa bao giờ thực sự hiểu)
Adam Ryczkowski

1
Có phải luôn luôn an toàn để giả định rằng sshdir sẽ là ~/.ssh? Điều đó có thể được thay đổi bởi một thiết lập cấu hình ở bất cứ đâu hay nó được mã hóa thành ssh?
terdon

2
Nó là một mặc định, có thể được thay đổi trong /etc/ssh/ssh_configsshd_config; ít nhất là trên Ubuntu 14.04
Adam Ryczkowski

4

bạn đang tìm kiếm thư mục nhà của $ myuser?

 awk -F: -v user=$myuser '$1==user { print $6 ;}' /etc/passwd

bạn có thể dùng

 awk -F: -v user=$myuser '$1==user { printf "%s/.ssh\n",$6;}' /etc/passwd

để có được .ssh dir.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.