IPCにUnixドメインソケットを使用するアプリケーションで作業しています。私が知っている一般的な方法は、ソケットファイルを/var/run
内に配置することです。私はUbuntu 18.04を使用していますが、var/run
は/run
のシンボリックリンクであることがわかりました。残念ながら、このフォルダにはroot
のみがアクセスできます。
ls -Al /
drwxr-xr-x 27 root root 800 Apr 12 17:39 run
したがって、このフォルダへの書き込みアクセス権を持つのはrootだけであり、これにより、通常のユーザーがUnixドメインソケットを使用することができなくなります。
まず、なぜかわからないのですが?また、非ルートユーザーにUnixドメインソケットを使用する方法は?もちろんホームフォルダーを使用することもできますが、いくつかの正しい一般的な方法を使用することを好みます。
ユーザーが特別なシステムユーザーでない場合は、ユーザーのホームディレクトリのdotfileまたはdotdirにソケットを作成しても何も問題はありません。唯一の問題は、nfsを介して複数のマシン間で共有されるホームディレクトリにありますが、ソケットの名前にホスト名を含めることで簡単に回避できます。
Linux/Ubuntuでは、 "abstract" Unixドメインソケットを使用することもできます。これは、ファイルシステムでパスやiノードを使用しません。抽象UNIXソケットは、アドレス/パスがNULバイトで始まるソケットです。
abstract:抽象ソケットアドレスは、
Sun_path[0]
がnullバイト(\0
)であることによって(パス名ソケットから)区別されます。この名前空間内のソケットのアドレスは、アドレス構造の指定された長さでカバーされる
Sun_path
の追加バイトによって与えられます。 (名前のNULLバイトには特別な意味はありません。)名前は、ファイルシステムのパス名とは関係ありません。抽象ソケットのアドレスが返される場合、返されるaddrlen
はsizeof(sa_family_t)
より大きく(つまり、2より大きく)、ソケットの名前は最初の(addrlen - sizeof(sa_family_t))
バイトに含まれますSun_path
。
ユーザーが表示または入力した場合、抽象的なUnixソケットアドレスのNULバイトは通常@
sに置き換えられます。通常の@
sをエスケープしたり、最初のバイトだけがNULであると想定したりしないため、多くのプログラムはこれをひどく間違っています。
通常のUnixソケットパスとは異なり、抽象的なUnixソケット名はセマンティクスが異なります。これは、誰でもバインドでき(名前がまだ取得されていない場合)、誰でも接続できるためです。
ソケットに接続できるユーザーを制限するためにファイル/ディレクトリのアクセス許可に依存する代わりに、たとえば、ルートのみが一部のディレクトリ内にソケットを作成できます。ピアの資格情報をgetsockopt(SO_PEERCRED)
(ピアに接続またはバインドしたユーザーのuid/pidを取得する)、またはSCM_CREDENTIALS
補助メッセージ(uid /ソケットを介してメッセージを送信した人のpid)。
これ(通常のファイルアクセス許可チェックを置き換える)も、SO_PEERCRED
/SCM_CREDENTIALS
IMHOの唯一の健全な使用法です。
UNIXドメインソケットは/run
に直接アクセスしないでください。/run
内にユーザーの適切な権限を持つ/run/my-ipc
などのフォルダーを作成し、そのフォルダーに書き込む必要があります。
フォルダーは起動時に再作成する必要があります。 この質問 の受け入れられた答えは、いくつかの選択肢を説明しています。