私はSaltを通して私の子供のコンピュータに配布するスクリプトを作成しました。スクリプトは許可された勤務時間を実装して正常に動作しますが、私の子供の1人がこの問題を解決する方法を見つけましたが、解決策がわかりません。
私はtimekprを使ってきましたが、中央で制御できるものを探しています。私はまた、timekprがロックされている間実行中のタスクを続行するのを防ぐことを発見しました。
子供たちのコンピュータは、パスワードなしでログインするために完全にパッチされたXubuntu 15.04を実行しています(パスワードはありますが、知る必要はありません)。
スクリプトがセッションをロックする前に、プログラムメニューのロックをクリックして手動で画面をロックすると、ユーザーアカウントが期限切れになってもセッションのロックを解除できます。予想される動作が復元される前に、この操作は一度だけ実行できます。
これは私のスクリプトです。
#!/bin/bash
users[0]='child1'
users[1]='child2'
users[2]='child3'
lock[0]=1930
lock[1]=1930
lock[2]=1930
unlock[0]=1300
unlock[1]=1300
unlock[2]=1300
# clean up at AT jobs that may already exist
for i in `atq | cut -f1`;
do
if at -c $i | grep -q '^/root/userRestrictions.sh$'
then
atrm $i
fi
done
currTime=`date +%k%M`
for i in {0..2}
do
if id -u "${users[i]}" >/dev/null 2>&1; then
# username exists
if [ "$currTime" -ge ${unlock[i]} ] && [ "$currTime" -lt ${lock[i]} ]; then
# current time is between unlock and lock time
# unlock the users account
/usr/bin/chage -E -1 ${users[i]}
# run this script again at the lock time
atHour=$(( ${lock[i]} / 100 ))
# extract minutes and pad with zeros
atMinute=$(( ${lock[i]} % 100 ))
atMinute=`printf %02d $atMinute`
echo "/root/userRestrictions.sh" | at "$atHour:$atMinute"
else
# current time is after lock time or before unlock time
# lock the users account
/usr/bin/chage -E 0 ${users[i]}
# lock screen if the user is logged in at all
if w | cut -d " " -f1 | grep -Fxq "${users[i]}"
then
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0 dm-tool lock
fi
# run this script again at the unlock time
atHour=$(( ${unlock[i]} / 100 ))
# extract minutes and pad with zeros
atMinute=$(( ${unlock[i]} % 100))
atMinute=`printf %02d $atMinute`
echo "/root/userRestrictions.sh" | at "$atHour:$atMinute"
fi
fi
done