在 14.04 中无需使用“gnome-screensaver-command”即可解锁屏幕

在 14.04 中无需使用“gnome-screensaver-command”即可解锁屏幕

我一直很高兴地在 13.10 中使用 blueproximity,但自从升级到 14.04 后,只有当我的手机超出范围时它才会锁定(使用gnome-screensaver-command -l),但不能用解锁gnome-screensaver-command -d

现在,这种方法gnome-screensaver-command -d行不通,是因为漏洞

然而在该错误报告中提到,gnome-screensaver 不再在 trusty 中使用,因此预计gnome-screensaver-command将被逐步淘汰,这也可能与该命令不起作用的原因有关。

所以我的问题是,如果 gnome-screensaver 被替换,那么不依赖于 解锁屏幕的新命令是什么gnome-screensaver-command

答案1

这对我有用:

在命令行上:

gsettings set org.gnome.desktop.a11y.applications screen-keyboard-enabled true

首次登录时会出现屏幕键盘,但您可以关闭它。

此项gnome-screensaver-command -d工作完成后。

摘自 benshaydenhttps://bugs.launchpad.net/ubuntu/+source/gnome-screensaver/+bug/1307163

答案2

不幸的是,没有办法做到这一点:(

更新 - 我找到了一种方法。查看我的较新的答案

这是我以前的解决方案-不建议使用,如果手机丢失则无法解锁;必须重新启动才能解锁

我最终想出了一个解决方案——一开始就不要锁它。这听起来可能很奇怪——请忍耐一下。

我没有锁定它,而是禁用了鼠标和键盘,隐藏了所有桌面图标,然后切换到桌面。您可能可以隐藏更多内容(例如启动器),但我还是隐藏了它。

此命令需要一些设置。

安装:xdotool-sudo apt-get install xdotool

输入:xinput --list并记下您的鼠标和键盘ID。

我建议编辑这些命令gedit

这个用作储物柜。

xinput set-prop <Keyboard ID> 'Device Enabled' 0 && xinput set-prop <Mouse ID> 'Device Enabled' 0 && gsettings set org.gnome.desktop.background show-desktop-icons false && wmctrl -k on

这起到了解锁的作用。

xinput set-prop <Keyboard ID> 'Device Enabled' 1 && xinput set-prop <Mouse ID> 'Device Enabled' 1 && gsettings set org.gnome.desktop.background show-desktop-icons true && wmctrl -k off

在两个命令中将和更改为其各自的数字。

为了这个:

  • 禁用/启用键盘
  • 禁用/启用鼠标
  • 隐藏/显示所有桌面图标
  • 切换显示您的桌面。

需要记住的一件重要事情是 - 如果没有蓝牙设备,此操作无法撤消。如果由于某种原因失败,则必须重新启动。因此,建议保持键盘启用,并将解锁命令设置为所选的快捷方式。

答案3

因此,我认为最好的办法是(这可能是伪造的,因为我们仍然存储密码,并且假装将其输入到某物中)正如我上面评论的那样,加密密码输入 USB 密钥。这个脚本有点混乱,所以我将解释一下发生了什么。

通过使用 xpath 查看 /etc/pamusb.conf 来枚举当前用户的设备;然后使用 xpath 将每个设备与其 UUID 匹配,并使用 blkid 将 UUID 映射到设备。

您可以选择锁定、解锁显示设备或设置密钥。运行设置时,如果不存在 ~/.ssh/pamusb_rsa,它将创建它。然后系统会要求您选择一个设备(如果只有一个,则不选择),并输入您的密码。您的密码将以加密形式存储在 {device}/.pamusb/.auth 中。

当您运行 unlock 时,将再次枚举设备,并逐个检查 /.pamusb/.auth 文件。当发现一个文件时,将尝试解密,如果成功,将用于将您的密码输入到当前正在接受的文本中。它将仅有的允许在会话锁定时运行,所以希望这不会给你带来太大的暴露。

我将其命名为 ~/.bin/unity-lock-control (~/.bin 在我的路径上),并在 pam.conf 中将“unity-lock-control lock”和“unity-lock-control unlock”作为我的代理。

#!/bin/bash
PAM_KEY=${HOME}/.ssh/pamusb_rsa
devices() {
    local NAMES NAME UUID DEV
    NAMES=$(xmllint /etc/pamusb.conf --xpath '//user[@id="'$USER'"]/device')
    NAMES=${NAMES//"<device>"/""}
    NAMES=${NAMES//'</device>'/' '}
    for NAME in $NAMES; do
        UUID=$(xmllint /etc/pamusb.conf --xpath '//device[@id="'$NAME'"]/volume_uuid/text()')
        DEV=$(blkid -U $UUID)
        if [[ -n $DEV ]]; then
            echo ${NAME}:${UUID}:${DEV}
        fi
    done
}
locked() {
    LS=$(ps -A -o cmd | grep 'unity-panel-service --lockscreen-mode' | grep -v grep)
    if [[ -z $LS ]]; then
        return -1
    else
        return 0
    fi
}
mounted() {
    MOUNTED=$(grep $1 /proc/mounts)
    if [[ -z $MOUNTED ]]; then
        return -1
    fi
    return 0
}
mount_point() {
    cat /proc/mounts | grep $1 | cut -d \  -f 2
}
case "$1" in
    devices)
        devices
        exit 0
    ;;
    lock)
        setsid paplay /usr/share/sounds/ubuntu/stereo/service-logout.ogg &
        setsid gnome-screensaver-command -l &
        sleep 1
        exit
    ;;
    unlock)
        if ! locked; then
            echo "Screen is not locked" >&2
            exit 1
        fi
        if [[ ! -f $PAM_KEY ]]; then
            echo "${PAM_KEY} does not exist; please run $0 setup." >&2
            exit 1
        fi

        DEVICES=$(devices)
        for device in $DEVICES; do
            NAME=$(echo $device | cut -d : -f 1)
            UUID=$(echo $device | cut -d : -f 2)
            DEV=$(echo $device | cut -d : -f 3)
            mounted $DEV
            MOUNTED=$?
            if [[ $MOUNTED -ne 0 ]]; then
                udisksctl mount -b $DEV
            fi
            AUTH_FILE=$(mount_point $DEV)/.pamusb/.auth
            if [[ -f $AUTH_FILE ]]; then
                PASS=$(openssl rsautl -decrypt -inkey $PAM_KEY -in $AUTH_FILE)
            fi
            if [[ $MOUNTED -ne 0 ]]; then
                udisksctl unmount -b $DEV
            fi
            if [[ -n $PASS ]]; then
                xdotool type --delay 0 "${PASS}" 
                xdotool key Return
                sleep 1
                if locked; then
                    setsid paplay /usr/share/sounds/ubuntu/stereo/service-login.ogg &
                else
                    setsid paplay /usr/share/sounds/ubuntu/stereo/dialog-warning.ogg &
                fi
                exit 0
            fi
        done
        echo "Did not find unlock key" >&2
        exit 1
    ;;
    setup)
        echo "This will set up an OpenSSL key, and encrypt your password to be stored"
        echo "on a pamusb authenticator."
        echo "-----"
        if [[ ! -d ${HOME}/.ecryptfs || ! -d ${HOME}/.Private ]]; then
            echo "Warning: Home folder is NOT encrypted" >&2
            read -p "Continue (y/N):" conf
            if [[ -z $conf ]]; then exit 1; fi
            if [[ $conf == "n" || $conf == "N" ]]; then exit 1; fi
        fi
        mkdir -p $(dirname $PAM_KEY)
        if [[ ! -f $PAM_KEY ]]; then
            openssl genrsa -out $PAM_KEY 1024
        fi
        DEVICES=$(devices)
        if [[ "${#DEVICES[@]}" -eq 1 ]]; then
            device="${DEVICES[0]}"
        else
            echo "Please select the device you would like to contain your encrypted password"       
            for i in "${!DEVICES[@]}"; do
                echo "$i: ${DEVICES[$i]}"
            done
            read selection
            device="${DEVICES[$selection]}"
        fi
        NAME=$(echo $device | cut -d : -f 1)
        UUID=$(echo $device | cut -d : -f 2)
        DEV=$(echo $device | cut -d : -f 3)

        mounted $DEV
        MOUNTED=$?
        if [[ $MOUNTED -ne 0 ]]; then
            echo "${NAME} is not mounted; attempting mount"
            udisksctl mount -b $DEV
        fi
        AUTH_FILE=$(mount_point $DEV)/.pamusb/.auth
        if [[ -f $AUTH_FILE ]]; then
            echo "Storing encrypted password to ${DEVICES[0]}"
            read -sp "Please enter your UNIX password:" PASS
            echo ""
            echo $PASS | openssl rsautl -encrypt -inkey $PAM_KEY -out $AUTH_FILE
        fi
        if [[ $MOUNTED -ne 0 ]]; then
            echo "${NAME} was not mounted; unmounting"
            udisksctl unmount -b $DEV
        fi
        exit 0
    ;;
    *)
        echo "Control for lock screen"
        echo $0 '{start|stop|devices|setup}'
        exit 1
    ;;
esac

答案4

更新!现在有办法使用普通锁屏了!太棒了!

我不知道它有多安全(以纯文本存储密码),但我认为这是最好的。

这是锁定命令:gnome-screensaver -d

有 2 个解锁命令:

第一名:

这是第一个解锁命令:

gnome-screensaver -d && xdotool type mypassword12 && xdotool key Return

单击即可唤醒它(由于鼠标移动,它应该单击登录框内),并显示漂亮的新锁屏,而不是“休眠”的黑屏。

然后在文本框中输入mypassword123!回车键以提交。

重要。出于某种原因 - 可能是因为 xdotool 的实际用途(键盘快捷键) - 您无法输入双字母。要解决这个问题,请在每个双字母处将其拆分为 2 个命令(如上所述)。此外,数字必须有自己的、与字母分开的命令(也如上所述)。最后,修饰符(例如 shift)需要单独的命令,Return 键也是如此。


第二名:

这是第二个。它稍微好一点,不太坑爹,但需要很多设置。

首先安装actionaz:

sudo apt-get install actionaz

打开一个新脚本,并将正确的项目拖到您的流程中。(您可以下载已完成的这里。如果您选择下载此文件,请打开它,双击在此处写入文本-密码,然后输入您的密码)。

  1. 暂停:输入3秒。
  2. 单击:复制并粘贴165:555到位置框中。(根据屏幕侧,这可能会有所不同。确保单击的是密码框,否则不起作用)。
  3. 写文字:在框中输入您的密码
  4. 按键:单击框并按回车键

将其保存在您的主文件夹中作为 unlock.ascr(或任何名称 - 我只是不想宣传其中有我的密码)

将您的接近命令设置为:

xdotool mousemove 0 0 && actionaz unlock.ascr -ex

鼠标移动将其唤醒,选项告诉它执行脚本,然后在最后退出。


如果您丢失了设备,您可以随时输入密码,因此它是可逆的。

相关内容