如何从awesome锁定会话

Rbj*_*bjz 5 13.10

我希望在 Ubuntu 13.10 上的 Awesome 中有一个简单的锁定功能,无论是按需还是不活动。

Rbj*_*bjz 6

获取食谱成分:

sudo apt-get install xautolock slock
Run Code Online (Sandbox Code Playgroud)
  • xautolock - 在一段时间不活动后执行储物柜。
  • slock - 使用纯黑色 UI 锁定屏幕,输入密码并按 Enter。

先尝试锁定会话的命令,看看你是否喜欢它:

sudo apt-get install xautolock slock
Run Code Online (Sandbox Code Playgroud)

这可以通过修改它的配置来连接到 Awesome 菜单:

slock
Run Code Online (Sandbox Code Playgroud)

找到 mymainmenu 的构建位置并进行调整。我的部分现在看起来像这样(注意“锁定”行):

# make awesome config dir:
mkdir -p ~/.config/awesome

# copy default config file to your home folder:
cp /etc/xdg/awesome/rc.lua ~/.config/awesome

# edit the custom config:
nano ~/.config/awesome/rc.lua
Run Code Online (Sandbox Code Playgroud)

并为它制作一个 Meta+Escape 快捷方式。本来Escape必然要标记history。虽然我不使用该功能。

lockscreen = function() awful.util.spawn("slock") end

mymainmenu = awful.menu({ items = {
            { "Lock", lockscreen },
            { "Awesome", myawesomemenu, beautiful.awesome_icon },
            { "Debian", debian.menu.Debian_menu.Debian },
            { "Guest", terminal .. " -e /usr/bin/dm-tool switch-to-guest" },
            { "Greet", terminal .. " -e /usr/bin/dm-tool switch-to-greeter" },
            { "Logout", awesome.quit },
         } 
      })
Run Code Online (Sandbox Code Playgroud)

然后是自动锁定。我创建了一个可执行文件以确保 xautolock 每个会话只执行一次:

-- it was:
--    awful.key({ modkey,           }, "Escape", awful.tag.history.restore),
    awful.key({ modkey,           }, "Escape", lockscreen               ),
Run Code Online (Sandbox Code Playgroud)

我使用了一个由 DM 设置的环境变量“XDG_SEAT”来区分会话并存储命令的 PID 和日志。它仅在尚未运行时才执行:

# make a bin folder if not present:
mkdir -p ~/bin/

# make the file, set permissions and edit:
touch ~/bin/session-daemon
chmod ug+x ~/bin/session-daemon
nano ~/bin/session-daemon
Run Code Online (Sandbox Code Playgroud)

该会话守护程序脚本将由 xautolock-session 使用:

#!/bin/bash

if [ "$#" == "0" ] ;
then
    echo "Session daemon missing command" >&2
    echo "USAGE: $0 command [args...]"
    echo "Executes given command with args only once per XDG seat (session)."
    echo "Keeps PID and log of the executed command."
    exit 1
fi

COMMAND=$1
shift

NAME="${COMMAND##*/}"
PIDFILE=~/.cache/session-daemon/$NAME-$XDG_SEAT.pid
LOGFILE=~/.cache/session-daemon/$NAME-$XDG_SEAT.log
PID=""
PIDDIR="${PIDFILE%/*}"
LOGDIR="${LOGFILE%/*}"

mkdir -p $PIDDIR
if [ $? -ne 0 ];
then
    echo "Session daemon PIDDIR not there: $PIDDIR" >&2
    exit 2
fi

mkdir -p $LOGDIR
if [ $? -ne 0 ];
then
    echo "Session daemon LOGDIR not there: $LOGDIR" >&2
    exit 2
fi

if [ -e "$PIDFILE" ] ; 
then 
    echo "Session daemon '$NAME' PIDFILE found: $PIDFILE"
    PID=`cat "$PIDFILE"` 
    echo "Session daemon '$NAME' PID found: $PID"
else
    echo "Session daemon '$NAME' PIDFILE NOT found: $PIDFILE"
fi

if [ "$PID" ] && kill -0 "$PID" 2>/dev/null ; 
then
    echo "Session daemon '$NAME' was already running with PID $PID" >&2
    exit 3
fi

echo "Session daemon running $COMMAND $* > $LOGFILE 2>&1"
$COMMAND $* > "$LOGFILE" 2>&1 &
PID=$!
ERR=$?
sleep 1

if [ "$PID" ] && [  $ERR == 0 ] && kill -0 "$PID" 2>/dev/null;
then
    echo -n $PID > "$PIDFILE"
    echo "Session daemon '$NAME' started with PID $PID"
else
    echo "Session daemon '$NAME' did not start or finished early. PID: $PID, ERR: $ERR" >&2
    cat "$LOGFILE" >&2
    exit 4
fi
Run Code Online (Sandbox Code Playgroud)

xautolock-session 内容:

# make the file, set permissions and edit:
touch ~/bin/xautolock-session
chmod ug+x ~/bin/xautolock-session
nano ~/bin/xautolock-session
Run Code Online (Sandbox Code Playgroud)

这将由 Awesome 在重新启动时执行。再次编辑 Awesome 配置:

#!/bin/bash

session-daemon xautolock -locker slock -time 5 -detectsleep -secure -corners "-00+"
Run Code Online (Sandbox Code Playgroud)

并在底部添加这一行:

nano ~/.config/awesome/rc.lua
Run Code Online (Sandbox Code Playgroud)

现在,当您注销并再次登录时,您的会话将在 5 分钟后自动锁定。

注意:我们也可以使用dm-tool lock,但是有一个奇怪的错误实际上打破了整个想法:可以通过切换到控制台来规避锁定