ユーザーを指定してホームを取得する方法は?


回答:


72

その情報が/etc/passwdLDAP などのローカルファイルに保存されているかどうかに関係なく、ユーザー情報を検索するユーティリティがあります。という名前getentです。

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

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

これで、たとえば次のようにcutを使用して、ホームディレクトリを簡単に切り取ることができます。

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

特にリモートユーザーの場合、getentがより良い答えです。単純なシステムでは、〜userで十分です。あなたを改造しました。
ルイFリベイロ

@RuiFRibeiroの~foo変数では使用できませんbash。とにかく、直接ではありません。
ムル

1
@muru-それは本当です-仕様の動作です。~けれども、タブ拡張に思えない、との別のspec'd行動チルダプレフィックスは、使用して得られたログイン名に関連付けられた最初の作業ディレクトリのパス名に置き換えられるものとするgetpwnam()機能をので、おそらく、ルックアップはかなり良好であることをと。ただし、タブ拡張は好きではありません。タブを入力するのが好きです。
mikeserv

1
これは、$ HOMEの初期値のみを取得することに注意してください。ユーザーのログインスクリプトには、それを別のものに変更する権利があります。これは珍しいことですが、ローカルとNFSマウントされたhomedirの選択など、それが賢明な状況を考えることができます。
zwol

1
@HagenvonEitzenコロンは、フィールドを区切るために使用されているため、禁止されています。
ジェニーD

9

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

eval echo "~$USER"

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


1
そこに評価する必要はありません。英語に注意してください。
ルイFリベイロ

4
@nwk an evalが必要です。Bashは~foo変数の展開後に処理しません。
ムル

1
興味深いことに、これは現在のユーザーのディレクトリのみを取得し、他のユーザーのディレクトリは取得しません。私は間違っているかもしれませんが、LDAPユーザーは処理されないと思います。
ルイFリベイロ

3
@RuiFRibeiroこれはLDAPで正常に動作します。LDAPユーザーのユーザー名を含む任意の変数を使用しますUSER
ムル

3
その検証せずにこれを使用しないでください$USERに展開するだけで、アルファベット文字の単一の文字列。
chepner

4

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

このファイルは誰でも読むことができるため(誰でも読むことができます)、すべてのユーザーがそのコンテンツにアクセスできます。
ファイルに$ USERが存在する場合、lastの前のエントリはユーザーのホームディレクトリです。

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

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

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

のコマンド

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

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


2
そのために〜userがあり、ソリューションはgetentを使用する必要があるLDAPからのユーザーのような、より複雑なシステムのユーザーを考慮していません。
ルイFリベイロ

2

ユーザーが存在しない場合、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'"

1

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

    su -c 'echo ~' ${USER}

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

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

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


システム構成によっては、これは安全ではありません。そのユーザーとしてプロセス(エコーを実行しているシェル)を実行するため、ユーザーは(たとえば)シェルをトレースして、任意の出力を提供できます。また、ユーザーのセットアップで実行されているため、ユーザーのシェル構成ファイルが実行される可能性があります(任意の出力を提供することもできます)。または、pamを介して環境がロードされます。または、SIGSTOPを送信するだけの簡単な操作を実行して、スクリプトを攻撃するDOSを効果的にDOS攻撃します。
デロバート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.