3

アプリケーションの実行中に、使用する共有ライブラリの1つが書き込まれるか切り捨てられると、アプリケーションがクラッシュします。OS(この場合はSolarisですが、Linuxやその他の* nixにも当てはまると思います)は、関連するiノードを削除しないほど賢いため、ファイルを移動したり、「rm」を使用してファイルを一括削除したりしても、クラッシュは発生しません。いずれかのプロセスでファイルが開いている間。

共有ライブラリのインストールを実行するシェルスクリプトがあります。場合によっては、最初にアンインストールせずに、すでにインストールされているバージョンの共有ライブラリを再インストールするために使用されることがあります。アプリケーションはすでにインストールされている共有ライブラリを使用している可能性があるため、スクリプトがファイルをrmしたり、邪魔にならない場所に移動したりするのに十分スマートであることが重要です(たとえば、アプリケーションがないときにcronが空にする可能性のある「削除済み」フォルダーに移動する)上書きまたは切り捨てられないように、新しいものをインストールする前に実行されます)。

残念ながら、最近、インストール直後にアプリケーションがクラッシュしました。一致?見分けるのは難しいです。ここでの本当の解決策は、古い巨大なシェルスクリプトよりも堅牢なインストール方法に切り替えることですが、切り替えが行われるまで、いくつかの追加の保護があると便利です。シェルスクリプトをラップして、ファイルの上書きや切り捨て(理想的には大音量での失敗)から保護し、それでもファイルを移動またはrm'dできるようにする方法はありますか?

移動/削除と上書き/切り捨てを区別できないため、標準のUNIXファイルパーミッションではうまくいきません。エイリアスは機能する可能性がありますが、どのコマンド全体をエイリアスする必要があるのか​​わかりません。truss / straceのようなものを想像しますが、各アクションの前に、実際に実行するかどうかをフィルターに対してチェックします。意図的に悪意のあるスクリプトに対しても機能する完璧なソリューションは必要ありません。

4

3 に答える 3

2

次の方法で、I/Oリダイレクトを介してスクリプトが上書きされるのを防ぐことができます。

set noclobber

による上書きcpなどを防ぐのは難しいです。私の傾向はPATH、スクリプトをリセットしてPATH、安全であることがわかっているコマンドを配置する「祝福された」ディレクトリである単一のエントリのみを含むようにすることです。これは、たとえば、のバージョンがcp常に--remove-destinationオプション(おそらくGNU-ism)を使用するように調整されていることを意味する場合があります。いずれの場合も、スクリプトがblessedディレクトリからのコマンドのみを実行するように調整します。次に、そのような各コマンドを個別に精査できます。

スクリプトが絶対パス名でコマンドを実行するのを防ぐことができればいいのですが、その方法がわかりません。通常のディレクトリにインストールを行っている場合、chrootそれらのディレクトリを表示するために多くのループバックマウントを行わない限り、jailはおそらく役に立ちません。また、インストール先のディレクトリに危険なコマンドが含まれている場合、それらから完全に保護する方法がわかりません。

ちなみに、install(1)インストールする前に宛先を削除するかどうかを確認しようとしましたが失敗しました。学ぶことは邪魔になるでしょう。

于 2010-03-06T22:25:35.123 に答える
1

私が推測するBashスクリプト?スクリプトは非常に長いですか?そうでない場合は、これを手動で行うことができます。

if [ ! -f /tmp/foo.txt ] #If file does not exist
then
    ...code
fi

しかし、これをスクリプトにラップする方法を求めていると思います。straceを使用してファイルの書き込みを確実に監視できますが、ルールなどを使用して何らかの侵入検知システムを設定しない限り、ファイルの書き込みを中断する機能はありません。

しかし、正直なところ、それが巨大なスクリプトでない限り、それはおそらくそれが価値があるよりも厄介です

于 2010-03-06T20:50:28.783 に答える
0

独自のsafe_install()関数を作成し、それらが使用される唯一のメソッドであることを確認してください。本当に確認する必要がある場合は、2つのプロセスを実行してください。1つには変更を加える権限があり、もう1つにはすべての権限を早期に削除して、実際のディスク作業を行うように他のスクリプトに指示します。

于 2010-03-07T01:30:45.663 に答える