Bash에서 각 사용자의 .ssh 디렉토리를 가져오는 안정적인 방법은 무엇입니까?

Bash에서 각 사용자의 .ssh 디렉토리를 가져오는 안정적인 방법은 무엇입니까?

augtool을 사용하여 /etc/passwd를 구문 분석할 수 있습니다.

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

...하지만 좀 너무 복잡한 것 같습니다.

사용자의 홈페이지를 표시하는 간단한 전용 도구가 있습니까(예 usermod:변화그것)?

답변1

절대 직접적으로 파싱 하면 안 됩니다 /etc/passwd. 원격 사용자가 있는 시스템에 있을 수 있으며, 이 경우 /etc/passwd해당 /etc/passwd파일은 다른 곳에 있을 수 있습니다. 등.

사용자 데이터베이스에 직접 액세스해야 하는 경우 을 사용하십시오 getent.

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

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

그러나 구문 분석을 포함하지 않는 또 다른 방법이 있습니다.

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

~셸의 운영자는 지정된 사용자의 홈 디렉터리로 확장됩니다. 하지만 eval변수의 확장은 $user의 확장 후에 발생하기 때문에 사용해야 합니다 ~. 따라서 eval및 큰따옴표를 사용하면 $user효과적으로 먼저 확장한 다음 호출 할 수 있습니다 eval echo "~phemmer".

홈 디렉토리가 있으면 /.ssh끝에 추가하기만 하면 됩니다.

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

답변2

$myuser의 홈 디렉토리를 찾고 계십니까?

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

당신은 그것을 사용할 수 있습니다

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

.ssh 디렉터리를 가져옵니다.

관련 정보