修正する

修正する

$HOMEsuを介してユーザー変数を取得しようとしています。

ソラリス

# 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

実際(クイックチェック)suSolarisでは、(権限のないユーザーから権限のない他のユーザーへ)まったく変更はありません$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
  • getentLDAPがある場合は、ローカルではなくユーザー参照を許可するユーティリティがある可能性があります。

おすすめ記事