web-dev-qa-db-ja.com

USERを指定してHOMEを取得する方法

スクリプトにUSER変数があり、HOME変数に基づいた彼のUSERパスを表示したいと思います。どうやってやるの?

41
MatthewRock

その情報が/etc/passwdなどのローカルファイルに保存されているか、LDAPやその他の方法で保存されているかに関係なく、ユーザー情報を検索するユーティリティがあります。これはgetentと呼ばれます。

ユーザー情報をそこから取得するには、getent passwd $USERを実行します。次のような行が返されます。

[jenny@sameen ~]$ getent passwd jenny
jenny:*:1001:1001:Jenny Dybedahl:/home/jenny:/usr/local/bin/bash

これで、ホームディレクトリを単純に切り取ることができます。次のようにカットを使用する:

[jenny@sameen ~]$ getent passwd jenny | cut -d: -f6
/home/jenny
74
Jenny D

evalを使用して、誰かのホームディレクトリを取得できます。

eval echo "~$USER"

少なくともローカルユーザーにとっては、これは確実に機能します。 LDAPのようなリモートユーザーがevalで処理されるかどうかはわかりません。

10
Sarolf.Thorleif

通常の場所は/home/$USER、しかしそれは普遍的である必要はありません。そのような情報を検索するための決定的な場所は、ファイル/etc/passwd

そのファイルは誰でも読み取り可能(誰でも読み取ることができる)なので、すべてのユーザーがその内容にアクセスできます。
$ USERがファイルに存在する場合、最後の前のエントリはユーザーのHOMEディレクトリです。

これによりエントリが選択され、HOMEディレクトリが出力されます。

awk -v FS=':' -v user="$USER" '($1==user) {print $6}' "/etc/passwd"

より複雑な(リモート)システムの場合、getentは、NSS(ネームサービススイッチライブラリ)システムからユーザー情報を取得する通常のコマンドです。

のコマンド

echo $(getent passwd $USER )| cut -d : -f 6

同等の情報を提供します(利用可能な場合)。

4
user79743

ユーザーが存在しない場合、getentはエラーを返します。

getentの終了コードを無視しない小さなシェル関数を次に示します。

get_home() {
  local result; result="$(getent passwd "$1")" || return
  echo $result | cut -d : -f 6
}

次に使用例を示します。

da_home="$(get_home missing_user)" || {
  echo 'User does NOT exist!'; exit 1
}

# Now do something with $da_home
echo "Home directory is: '$da_home'"
2
Elifarley

Rootとしてログインしている場合、USERのパスワードがわかっている場合、またはUSERにパスワードがない場合は、次のオプションも使用できます。

    su -c 'echo ~' ${USER}

標準のsuの動作では、USERが未定義または空の場合、suはrootとしてコマンドを実行しようとします。

USERの値が有効なユーザー名でない場合、適切なエラーが発生します:su: user <user> does not exist

ここには既に良い答えがたくさんありますが、これはまだ誰かを助けるかもしれません。

1
monotonee