/bin/sh や /usr/bin/cowsay などの項目を参照するときに、代わりに ~/fake/bin/sh を実行するようにスクリプトを実行する方法はありますか?
この効果は、実行中の他のスクリプトと実行されるスクリプトに対して引き続き有効でなければなりません。
答え1
スクリプトが協力的である場合、つまり意図的にあなたと戦うことを望んでいない場合は、次のものを使用できます。chrootディレクトリツリーのサブツリーで実行します。 chrootで実行されているプログラムは自分のツリーの外側のファイルに直接アクセスすることはできませんが、プロセスへのシグナリング、ソケットを介した通信、ネットワークアクセスなど、他の方法で外部の世界と対話できます。
chroot ~/fake myscript
サブツリーには、~/fake
スクリプトに必要なもの~/fake/bin/sh
、~/fake/lib/ld-linux.so.2
および/またはLinuxで作業するための~/fake/lib/libc.so.6
システムの動的ローダーと標準ライブラリなどが含まれている必要があります。シンボリックリンクの巡回自体はchroot制約に従うため、シンボリックリンクではなく実際のファイルである必要があります。/proc
ps
バインドマウント必要なファイルをすべてコピーせずにchrootツリーを構築するのに役立ちます。
Chrootにはroot権限が必要です。実行したいすべてのプログラムが動的にリンクされている場合は、次のものを使用できます。fakechroot
より軽い方法でchrootを使用してください。 Fakechrootはシステムコールを傍受して機能します。ライブラリのプリロードしたがって、権限は必要ありません。 fakechrootを使用すると、通常はchrootの外側を指すシンボリックリンクに従うため、シンボリックリンクフォレストを構築してサブツリー内のコンテンツを使用できます。
スクリプトが協力しない場合は、適切な分離ツールが必要です。コンテナまたは仮想マシン。
答え2
シンボリックリンクを試してください。
sudo ln -sf ~/fake/bin/sh /usr/bin/cowsay
注:(-f
強制)により、元のファイルが/usr/bin/cowsay
シンボリックリンクに置き換えられます。
実行可能ファイルのステートメント~/fake/bin/sh
または実行可能ファイルによって呼び出される外部プログラムがシンボリックリンク自体で機能するのか、シンボリックリンクが指すファイルで機能するのかは、プログラムごとにステートメントごとに異なります。