「setcap」は最後の関数をオーバーライドします。複数の機能を設定するには?

「setcap」は最後の関数をオーバーライドします。複数の機能を設定するには?

Node.jsがポート80でリッスンしてコンピュータをシャットダウンするようにしたいと思います。最初は、次の2つのコマンドを順番に試しました。

setcap cap_net_bind_service=+ep /usr/bin/nodejs
setcap cap_sys_boot=+ep /usr/bin/nodejs

これにより、私のアプリケーションはポート80にバインドできません。 getcapで確認しました。

# getcap /usr/bin/nodejs
/usr/bin/nodejs = cap_sys_boot+ep

cap_net_bind_serviceに対してsetcapを再実行すると、次のようになります。

# getcap /usr/bin/nodejs
/usr/bin/nodejs = cap_net_bind_service+ep

マニュアルページには何も表示されませんhttp://linux.die.net/man/8/setcapいくつかの機能を設定し、必死にいくつかを試す方法は次のとおりです。

# setcap cap_net_bind_service=+ep /usr/bin/nodejs cap_sys_boot=+ep /usr/bin/nodejs
# getcap /usr/bin/nodejs
/usr/bin/nodejs = cap_sys_boot+ep
# setcap cap_net_bind_service=+ep cap_sys_boot=+ep /usr/bin/nodejs
Failed to set capabilities on file `cap_sys_boot=+ep' (No such file or directory)

複数の機能を設定するには?

答え1

最後の切迫した構文の推測が成果を上げました。

# setcap cap_net_bind_service,cap_sys_boot=+ep /usr/bin/nodejs
# getcap /usr/bin/nodejs
/usr/bin/nodejs = cap_net_bind_service,cap_sys_boot+ep

答え2

この質問をする人には:他の機能に対して異なるアクションを指定するには、次の構文が必要です。

# this is for illustrative purposes only
# obviously it's not how you would formally define the syntax
setcap "<CAP_0,CAP_1,...><ACTIONS_A> <CAP_2,...><ACTION_B> ..."

=+eipしたがって、OPの例を使用してforの代わりにcap_net_bind_service設定すると仮定すると、=+ep次のようになります。

setcap "cap_net_bind_service=+eip cap_sys_boot=+ep" /usr/bin/nodejs

より正式には、許容されるすべての「能力記述」は、スペースで区切られた複数の「節」で構成されsetcap、各節は次の形式を持ちます<CAP_NAME_LIST><OPS><FLAGS><OPS><FLAGS>ペアは「作業」とも呼ばれます)。

したがって、前述の例を挙げると、次のようになります。

cap_net_bind_service=+eip cap_sys_boot=+ep

これは、カンマで区切られた関数名のリスト(このリストには1つのエントリしかありません)、演算子(リセット後に発生)、およびフラグ(有効、継承可能、および許可)のcap_net_bind_service=+eip最初の句です。二番目の条項なども同じだ。cap_net_bind_service=+eipcap_sys_boot=+ep


完全な構文の詳細な説明については、マニュアルページを参照してくださいcap_from_text。これは協会die.netを読みたい場合。

関連情報