
すべてのユーザーログインでrootとしてプロセスを開始したいと思います。これに加えて、同期はプロセスが特定のユーザーフォルダの暗号化されたホームフォルダで実行されることです。
この目標をどのように達成できますか?
答え1
システムで以下を使用する場合ポリアクリルアミド(ほとんど)あなたは利用可能ですpam_exec
スタックのモジュールsession
。コマンドが完了するまでユーザーはログインしません。バックグラウンドで何かを実行するには、分岐します。一部環境変数セッションに関する情報を提供します。たとえば、
session optional pam_exec.so seteuid /usr/local/sbin/my-login-process
次/usr/local/sbin/my-login-process
の内容が含まれています。
#!/bin/sh
{
exec 2>&1 >>"/var/log/my-root-service/$PAM_USER.log"
echo "$PAM_USER logged in on $PAM_TTY on $PAM_RHOST at $(date)"
do-something
} &
答え2
/etc/sudoers
ファイルに次の行を追加します(ショートカットvisudo)。
Cmnd_Alias CMDNAME = /path/to/binaryOrscriptToBeRunAsRoot
%groupnamehere ALL=NOPASSWD: CMDNAME
ユーザー名のみを使用する代わりにCMDNAMEグループを作成すると、そのグループ内のすべてのユーザーがその権限を持ちます。
groupadd groupnamehere
usermod -G groupnamehere usertoaddtogrouphere
これをテストするには、ユーザーになり、次のコマンドを実行します。
- ユーザーになる => su - ユーザー名
- グループユーザーが=>グループにいることを確認してください。
- コマンド実行 => sudo CMDNAME 再起動
- グローバルコマンドでない場合は、=> sudo /path/to/binaryOrScript argを実行してください。
例は次のとおりです。
/etc/sudoers
Cmnd_Alias TESTME = /usr/local/bin/testme.sh
%cmdgroup ALL=NOPASSWD: TESTME
/usr/local/bin/testme.sh
#!/bin/sh
#netstat can only be run by root on my servers.
#File permissions are 'chmod 700'
netstat -tln |grep :80
/etc/設定ファイル
# You need to change 'testme' in the boundry to match the groupname created
# This checks to see if the user who just logged is part of that cmdgroup,
# if so, it runs whatever is inside.
username=`id -un`
if groups $username | grep &>/dev/null '\btestme\b'; then
sudo /usr/local/bin/testme.sh
fi
このグループのユーザーとしてログインして、次のことを確認してください。
[nonrootuser ~]#
tcp 0 0 :::80 :::* LISTEN