2017-03-17 11 views
0

私は最近〜がHOME変数を参照していることを知りました。上書きされたHOME変数

FOO /ドキュメント:ベストプラクティスは何そのようなファイルやディレクトリ

私は、HOME =/fooのを設定してあれば、それは言って終わるにcd〜/書類をご希望のbashスクリプトを使用するようにしてくださいこの状況では?クラッシュし、HOMEに上書きしたとユーザーに苦情を言いますか?またはHOMEのデフォルト値を回復する方法はありますか?

+0

状況によって異なります。多くのツールでは、環境変数がインターフェースの一部(LC_ *やロケールなど)を構成し、ユーザーが明示的に設定できるようにしたいとします。'sudo'のような他のケースでは、予期しないことが起きないように環境をパージする必要があります。あなたのスクリプトで何をしていますか? –

+0

彼らが 'HOME'を変更した場合、アプリケーションがそのディレクトリをホームディレクトリとして扱うようにすることを意味します。彼らの希望を覆すことはあなたの責任ではありません。 – Barmar

+0

もう1つのリカバリオプションは、 '$ USER'を使って標準の場所で'/home/$ USER'をテストし、 '$ HOME'を復元したい場合に利用可能にすることです。スクリプトの中でこれを行うことはできず、シェルに影響することは理解できません。スクリプトで実行されるプロセスの環境は変更できますが、親プロセスは変更できません。したがって、ユーザがスクリプト内で '$ HOME'を変更した場合、@ Barmarのコメントに行きます。 –

答えて

1

私はあなたがファイルにアクセスする他の問題のようにこれを扱うべきだと思います。アクセスしようとしているファイルが存在しないか、ディレクトリにファイルを作成しようとしていてアクセスできない場合は、エラーメッセージを表示します。アプリケーションの操作が重要な場合は、エラーを報告した後に終了します。

私の知る限り、ユーザーのホームディレクトリを使用する必要があるほとんどのアプリケーションは、HOMEという環境変数を使用するだけで、2番目の推測を試みません。

これにはセキュリティ上の意味はありません。ユーザーは依然としてファイルにアクセスするための適切なアクセス許可が必要なので、HOMEをリダイレクトすると、他人のファイルを書き込まないようにすることはできません。アプリケーションがset-uidの場合は、ユーザーのディレクトリにあるファイルを開くときには常にユーザーのIDに戻り、昇格された権限は使用しないようにしてください。

1

ユーザーのホームディレクトリの真実のソースは/etc/passwdです。これには、システム上のすべてのユーザーの行が含まれ、ユーザーの名前、ホームディレクトリ、その他の情報が一覧表示されます。あなたの質問は、「まあまあのホームディレクトリは何ですか?」である場合は、/etc/passwdでそれを調べる必要があります。*

しかし、ユーザーは、彼らは、他のいくつかのパスで$HOMEを上書きさた場合/etc/passwdは、正しいことをしながら、 「本当の」ホームディレクトリの代わりにその値を使用することをお勧めします。ユーザーがホームディレクトリをスプーフィングすることを許可するセキュリティ上の問題がない限り、ユーザーが指定した値を盲目的に使用することが望ましい場合があります。

個人的には、$HOMEがディレクトリであるかどうかを確認します(例:if [[ -d "$HOME" ]])。その場合はそのまま使用します。そうでない場合はgrepcutを使用して/etc/passwdから解析します。恐らくstderrに警告が出力され、ユーザーに$HOMEが不良であることを通知します。 id -uで印刷されたUIDに対してgrepを実行することができます。これは、root以外のユーザーには拘束されません。

$HOMEが本当に心配しているのであれば、$PATH$LC_*変数、およびさまざまな事柄を壊す可能性のあるいくつかの環境変数についても心配する必要があります。最終的には、セキュリティ上の懸念がない限り、これらの変数が正しいと仮定し、そのまま使用する方が簡単です。つまり、は盲目的に$HOMEを使用し、間違っていると心配しないでください。

は*アカウントを管理するLDAPまたは類似のネットワーク化されたシステムを使用しているシステムでは、ユーザーのアカウントが表示されない場合があります。場合によっては/etc/passwd.cacheなどがありますが、これにはユーザーが含まれることがありますが、これはすべてのシステムで動作するとは限りません。 strace(1)whoami(1)に掲載すると、この情報がどこから来ているかを示すのに役立ちます。

+0

'/ etc/passwd'のどの行ですか? '$ USER'と' $ LOGNAME'も上書きすることができます。 – Barmar

+0

@Barmar:ありがとう、修正されました。 – Kevin

+0

同じuidを持つ複数のユーザーが存在する可能性があります。ユーザ名は、ログイン時に '/ etc/passwd'行を選択するために使用されます。私は 'whoami'が'/var/run/utmp'を見て、現在の端末に関連付けられているユーザ名を探すと思います。 – Barmar

関連する問題