1.ログアウトして再度ログインせずに、新しいグループでシェルを取得する
グループを1つだけ追加する場合は、次を使用しました。
exec sg <new group name> newgrp `id -gn`
これは、Legooolasの2層newgrpトリックのバリエーションですが、1行であり、プライマリグループを手動で入力する必要はありません。
sg
newgrpですが、新しいグループIDで実行するコマンドを受け入れます。これexec
は、新しいシェルが既存のシェルを置き換えることを意味するため、2回「ログアウト」する必要はありません。
suの使用とは異なり、パスワードを入力する必要はありません。また、(グループを追加する以外に)環境を更新しないため、現在の作業ディレクトリなどを保持します。
2.セッションのすべての画面ウィンドウでコマンドを実行する
at
画面内のコマンドを使用すると、(これはscreenコマンドではなく、シェルコマンドであることに注意)を指定するものは何でもウィンドウでコマンドを実行します。
次のコマンドを使用して、既存のすべてのScreenセッションにコマンドを送信できます。
screen -S <session_name> -X at \# stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"
id
Screenセッションで実行するためにバックティックをエスケープする必要があることに注意してください。また、コマンドの最後にScreenを入力してEnter キーを押すには^ Mを使用する必要があります。
また、画面のstuff
コマンドは単にユーザーに代わってコマンドテキストを入力するだけです。したがって、画面ウィンドウの1つがコマンドプロンプトで半分書かれたコマンドを持っているか、シェル以外のアプリケーション(emacs、topなど)を実行している場合、奇妙なことが起こります。これが問題である場合、いくつかのアイデアがあります。
- 半分書かれたコマンドを削除するには、コマンドの先頭に「^ C」を追加します。
- emacsウィンドウなどでコマンドを実行しないようにするには、ウィンドウタイトルなどでフィルタリングするように「at」に依頼します(上記の例では、すべてのウィンドウに一致する「#」を使用しますが、ウィンドウタイトル、ユーザーなど)。
特定のウィンドウ(ウィンドウ番号で識別)でコマンドを実行するには、次を使用します。
screen -S <session_name> -p 0 -X stuff "exec sg <new_group_name> newgrp \`id -gn\`^M"