なぜですか。デフォルトではパスにありませんか?


63

長年にわたるUNIXライクなシステム(私にとって最も関連性の高いLinux)では、.(現在のディレクトリ)が$PATHデフォルトでは決して存在しないことに気付きました。どうしてこれなの?

私は何年も前にそれがセキュリティ問題であったことを思い出したが、私が読んだ記事は問題が正確に何であるかを説明しなかった。誰かがディレクトリの悪意のあるバージョンを残しlsたりcp、ディレクトリに残したりする可能性があり、それが存在することに気付かずに実行することになりますか?


6
他のプログラムを実行する他のプログラム(およびスクリプト)ほど、インタラクティブなユーザー保護用ではありません。経験豊富なユーザーでさえ、ランダムなディレクトリにいるときlsとそう/usr/bin/ls./lsないことを知っていることが好きです。また.、パスの最後に追加する方法を知っている場合は、おそらく自分が何をしているのかを知っているというハードルがあります。根がなければならない決して持っていない.パスに、多くのシステムであっても、もはやでルートログをさせてください。
msw

回答:


41

あなたはあなた自身の質問に正しく答えました、それがまさにドットがパスにない理由です:
幼稚なウイルスや正直な間違いから保護するため。

もちろん、これは非常に不十分で役に立たないアンチウイルス対策であり、自分でパスにドットを追加することを妨げるものは何もありません。


13
面白いの-rfは、ディレクトリ内の孤立したファイルからではなく、これから保護されていることです(rm *面白くなります);
Joey

Unixの答え:-rfそもそもなぜファイルに名前を付けたのですか?;)
msw

2
@msw:別のUnixの答えは、通常、パス内のドットは管理者アカウントでは眉をひそめますが、非管理者では問題ありません。
harrymc

現在のパスが最後のパスである場合、プログラムのすべての通常の場所が最初にチェックされるように、リスクは大幅に削減されますか
ジョンz

1
@Jonz:そうでもない。しかし、コンピューターがウイルスに感染していない場合、リスクは非常に小さくなります。また、コンピューターが感染している場合、最新のウイルスを使用すれば、心配はありません。
ハリーマック

4

はい。「。」を入れると パスでは、現在のディレクトリ内のファイルに多くのコマンド呼び出しを送信することになります。

それが最後だったとしても、パイロットエラーがまだあります。たとえば、Solaris 10には「トップ」がありません。私は「トップ」を持つシステム上にいると思うので、一日中システム上で「トップ」と入力します。


1

申し訳ありませんが、選択した回答へのコメントの形でこれをお願いしたいのですが、スーパーユーザーに関する担当者はまだいません。

セキュリティの答えは理にかなっていますが、「。」を付けると 最後にPATHで、シェルは実行可能ファイルを検索するとき、現在のディレクトリを最後に見て、セキュリティリスクを減らすべきではありませんか?$ PATHを順番に検索した場合、。/ lsを見つける前に/ bin / lsを見つけます。

したがって、「。」を付けるのはどれほど安全ではないのでしょうか。$ PATH環境変数の最後に?

私が提案するように動作します。テスト方法は次のとおりです。

まず、「。」を追加します PATH環境変数のENDに。

次に、〜/ dir1 / dir2 / test_which.rbなどのディレクトリに次のファイルを配置します。

#!/your/path/to/ruby

puts "this file is from the current directory"

そして、このファイルを/usr/bin/test_which.rbに配置します

#!/your/path/to/ruby

puts "this file is at /usr/bin/test_which.rb"

実行可能になるように、ファイルを必ずchmod + xしてください。

ここで、ディレクトリを〜/ dir1 / dir2に変更してtest_which.rbを実行すると、出力が表示されます

this file is at /usr/bin/test_which.rb

実際、どこからでも "which test_which.rb"を実行すると、レポートされるはずです。

/usr/bin/test_which.rb

次のように入力することにより、現在のディレクトリでファイルを実行できます。

./test_which.rb

8
誰もこのような、タイプミスをしなかったdcか、slまたはsduoシェルで、かつ「コマンドが見つかりません」ということで救われました。今まで。
ダニエルベック

1
ダニエルに同意します:スペルミスのコマンドにちなんで名付けられた悪意のあるスクリプトがあるかもしれません。この回答も参照してください。
イグニス

@DanielBeckでは、入力ミスのためにエイリアスを使用する必要があります。私の好みの設定ls(カラー出力など)をエイリアスしl、タイプミスを完全に排除しています。
カールダンガードアス

1
@KarlDamgaardAsmussen kl
deworde

個人的に「。」は追加しません 私の道へ。./runなどのローカルディレクトリでの入力はそれほど難しくありません。予期しないものを拾うのを何度か助けてくれました。トマトとまと。
マイケルマシューズ

1

「。」を持つセキュリティリスク以上のもの PATHでは、コマンドの実行が意図したとおりに動作することを確認することはほとんど不可能です。ランダムな名前の何千ものファイルを含む巨大なディレクトリで「zip」のようなコマンドを実行することを考えてください。それらの1つが実際に 'zip'という名前である可能性は無視できず、非常に理解しにくいエラーにつながります(実際にはファイルは実行可能である必要がありますが、これは発生する可能性があります)。

特に、これはユーザーのPATH変数を保持するスクリプトを作成する場合に当てはまります。適切に記述されたスクリプトは、すべてのコーナーケース(スペースを含むファイル名や「-」で始まるファイル名など)に対処する必要があります。しかし、システムコマンドの代わりに現在のディレクトリのファイルが実行されるのを防ぐことは実用的ではありません...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.