$HOME
suを介してユーザー変数を取得しようとしています。
ソラリス
# su oracle
$ echo $HOME
/root
AIX
# su oracle
$ echo $HOME
/
Linux
# su oracle
$ echo $HOME
/home/oracle
SolarisとAIXで$HOME
変数を取得しようとしたときにルートを取得する理由を誰かが説明できますか$HOME
?
修正する
-
withまたはloginを使用すると機能しますが、スクリプトで機能させることは-l
できません。su -
この問題を克服する方法についてのアイデアはありますか?
上記の回避策を使用しようとしませんでしたが、選択肢はありませんでした。
cat /etc/passwd | grep oracle | cut -d: -f 6
またはThomasが提案したように:
cat /etc/passwd | awk -F: '$1 ~ /^'oracle'$/ {print $6;}'
ベストアンサー1
実際(クイックチェック)su
Solarisでは、(権限のないユーザーから権限のない他のユーザーへ)まったく変更はありません$HOME
。おそらくあなたは根コマンドを出すときsu
。
Solaris のマニュアルページにはこの問題は記載されていませんが、以下で引用される既知の問題です。ニュースグループコメント:
nails September 16, 2008 at 18:16:45
jefro:
Sorry I must disagree wtih you. At least in Solaris su <user id>
doesn't change the user environment - including environmental
variables. To change the environment, you must execute
su - <user id>
According to the su MAN page:
If the first argument to su is a dash (-), the environment will
be changed to what would be expected if the user actually logged
in as the specified user.
ただし、マニュアルページにはさまざまな変数の内容が記載されていますが、次の内容は記載されていませんHOME
。
o In addition to what is already propagated, the LC* and
LANG environment variables from the specified user's
environment are also propagated.
o Propagate TZ from the user's environment. If TZ is not
found in the user's environment, su uses the TZ value
from the TIMEZONE parameter found in
/etc/default/login.
o Set MAIL to /var/mail/new_user.
If the first argument to su is a dash (-), the environment
will be changed to what would be expected if the user actu-
ally logged in as the specified user. Otherwise, the
environment is passed along, with the exception of $PATH,
which is controlled by PATH and SUPATH in /etc/default/su.
最後の文は、現在のユーザーのHOME
変数が変更されずに渡されるという意味で解釈することができます(su -
もちろん、「」形式を使用しない限り)。
その他のシステム:
- AIXマニュアルページあまり役に立ちませんが、両方の機能は古い機能なので、動作はおそらく同じソースコードに基づいています。
- 高性能ユーザー体験システムマニュアルページ「以前に定義された」と言っても役に立ちません。
HOME
そしてENV
環境変数は削除済み」。
su
必要な情報が提供されていないため、他のアプローチが役に立ちます。アカウントがすべてローカル(LDAPなし)の場合は、いつでも検索できます/etc/passwd
。
THATHOME=$( awk -F: '$1 ~ /^'$THATUSER'$/ {print $6;}' </etc/passwd )
メモ:
- フォーマットは
/etc/passwd
すべてのUnixシリーズシステムで同じです。 - フィールドを複数のフィールドに分割すると、たとえばアカウントがある
awk
場合、grepが誤った行を選択するという問題を回避できますoracleadmin
。 getent
LDAPがある場合は、ローカルではなくユーザー参照を許可するユーティリティがある可能性があります。