
指定された数値uid、gid、およびグループを使用してシェルを起動するには、どのコマンド(配布ストアで利用可能)を使用する必要がありますか?通常、su
ルートから別のユーザーに変更するために使用されますが、外部ファイルシステム、名前空間、およびDockerコンテナを使用するときに存在しない可能性がある名前でグループを見つけようとします。
私はnsswitchやnsswitchを必要とせずにsetgroups(2)
、、、および、setgid(2)
しかしsetuid(2)
実行する簡単なアプリケーションでありたいです。これらのプログラムをCで実装するのは簡単ですが、このユースケースでは標準および配布可能なプログラムを使用できますか?execve(2)
/etc/passwd
答え1
答え2
chroot
chroot --userspec=1000:1000 --groups=1001,1002 / /bin/bash
Chroot にはオプションが--userspec
あり、--groups
通常はディストリビューションで使用できます。ターゲットディレクトリを設定すると、/
chroot nilの主な目的がレンダリングされますが、uid/gid/groupsオーバーライドの効果はそのまま残ります。
答え3
Perlがあり、UIDとGIDにのみ興味がある場合、これは比較的簡単です。
# perl -e '$( = 456; $) = "456 1111 2222"; $< = $> = 123; exec("id")'
uid=123 gid=456 groups=456,1111,2222
$(
$)
実際の有効なGIDと実際の有効なUID(順番に)です$<
。複数の数値を表す文字列を受け入れることができ、補助グループも設定されます。 (このリストを消去するには、たとえばマスターGIDを2回設定します。)$>
$)
$) = "456 456"
またはEnglish
:
# perl -MEnglish -e '$GID = 456; $EGID = "456 1111 2222"; $EUID = $UID = 123; exec("id")'
uid=123 gid=456 groups=456,1111,2222
も使用できます。POSIX::set[gu]uid()
もちろん、$!
特殊変数を修正した後にエラーがないかどうかを確認する必要があります。グループまたはUIDを変更する権限がない場合、上記の操作は自動的に失敗します。