スクリプトにUSER
変数があり、HOME
変数に基づいた彼のUSER
パスを表示したいと思います。どうやってやるの?
その情報が/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
eval
を使用して、誰かのホームディレクトリを取得できます。
eval echo "~$USER"
少なくともローカルユーザーにとっては、これは確実に機能します。 LDAPのようなリモートユーザーがeval
で処理されるかどうかはわかりません。
通常の場所は/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
同等の情報を提供します(利用可能な場合)。
ユーザーが存在しない場合、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'"
Rootとしてログインしている場合、USER
のパスワードがわかっている場合、またはUSER
にパスワードがない場合は、次のオプションも使用できます。
su -c 'echo ~' ${USER}
標準のsu
の動作では、USER
が未定義または空の場合、su
はrootとしてコマンドを実行しようとします。
USER
の値が有効なユーザー名でない場合、適切なエラーが発生します:su: user <user> does not exist
。
ここには既に良い答えがたくさんありますが、これはまだ誰かを助けるかもしれません。