私はそのようなシェルスクリプトを持っています:
#/bin/sh
#do some stuff
しかし、インタプリタsh
は/bin/
ではなく、別のディレクトリにあります。同様に、スクリプトは書き込みアクセス権のないディレクトリにフォルダを作成します。 sh
がsedを使用しているディレクトリを置き換えましたが、相互に依存するスクリプトの負荷により、作成される可能性のあるすべてのディレクトリを変更することはできません。
ファイルシステム/読み取り/書き込みをエミュレートして、スクリプトがサンドボックス化され、Windowsでサンドボックスが行うのと同じように、それが望みどおりのことを実行できるようにする方法はありますか?
探しているのは、少なくとも chroot 環境です。つまり、システムのディレクトリツリーのサブツリーにのみアクセスできるプログラムを実行しています。 chrootはファイルシステムアクセスにのみ適用されることに注意してください。他の方法でプロセスを制限することはありません。chroot内のプロセスは、ネットワークにアクセスしたり、chrootの外部のプログラムをデバッグしたりできます。
Chrootはファイルシステムへのアクセスをシンボリックリンクを介しても制限します。chrootの外部を指すシンボリックリンクがある場合、chrootされたプロセスからアクセスされると、絶対シンボリックリンクはchrootのルートから、相対シンボリックリンクは..
は、chrootのルートより上には移動しません。したがって、chrootを含むファイルを別の場所にアセンブルするために、シンボリックリンクを使用することはできません。 bind mounts を使用するか、ファイルをコピーする(ただし、これにはスペースが必要であり、自動的に更新されない)、またはハードリンクを使用する(ただし、これは設定に不便であり、ファイルシステム間で実行できない) 。
chroot
システムコールは、ルートによってのみ呼び出すことができます。非rootユーザーとして、代わりに fakechroot を使用できます。これは、動的にリンクされているプログラム(ほとんどのプログラム)でのみ機能します。 Fakechrootは複数の場所からディレクトリツリーをアセンブルできるため、バインドマウントを使用する必要がないことがよくあります(ただし、バインドマウントが必要な場合は、ルート権限なしでbindfs
を使用できます)。