Разблокировка экрана в 14.04 без `gnome-screensaver-command`

10

Я с радостью использовал blueproximity в 13.10, но после обновления до 14.04 он блокируется только тогда, когда мой телефон выходит из зоны действия (используется gnome-screensaver-command -l), но не разблокируется с помощью gnome-screensaver-command -d.

Теперь причина, по которой gnome-screensaver-command -dэто не работает, из-за ошибки .

Однако в этом сообщении об ошибке упоминается, что gnome-screensaver больше не используется в trusty и, следовательно, gnome-screensaver-commandожидается, что он будет прекращен, что также может быть связано с тем, почему команда не работает.

Поэтому мой вопрос: если заменить экранную заставку gnome, то какой будет новая команда, чтобы разблокировать экран, не полагаясь на него gnome-screensaver-command?

d_inevitable
источник
@Braiam Этот вопрос относится к 14.04 и позже. Почему вы удалили тег? Нет причин, по которым следует избегать использования gnome-screensaver-commandв более ранних версиях!
d_inevitable
Вы сами ответили: 14.04 и позже . 14.04 следует использовать, только если это единственная затронутая версия, что неверно, поскольку в 14.10 она есть. Кстати, не спрашивайте об ошибках.
Брайам
@Braiam 1. Я не знаю, позже! Как я могу? Более поздней версии пока нет. На данный момент это только 14.04. И я не спрашивал об ошибках. Так что, если вы не возражаете, я верну ваши изменения.
d_inevitable
Шутки в сторону? cdimage.ubuntu.com/daily-live/current попробуйте.
Брайам
1
@Braiam это не релиз.
d_inevitable

Ответы:

6

Это сработало для меня:

В командной строке:

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

Экранная клавиатура появляется при первом входе в систему, но вы можете закрыть ее.

После этого gnome-screensaver-command -dработает.

Взято из Беншайдена на https://bugs.launchpad.net/ubuntu/+source/gnome-screensaver/+bug/1307163

Тоби абель
источник
Это должно быть гораздо выше, чем другие ответы. Вы не должны вводить свой пароль в эти скрипты, это действительно плохо!
Патрик Корнелиссен
3

К сожалению, сделать это невозможно :(

Обновление - я нашел способ. Проверьте мой новый ответ

Это моё предыдущее решение: его нельзя использовать, его нельзя разблокировать, если вы потеряете свой телефон; Вы должны перезагрузить, чтобы разблокировать его

В конце концов я нашел решение - не блокируйте его в первую очередь. Это может звучать странно - терпеть.

Вместо блокировки я отключил мышь и клавиатуру, спрятал все значки на рабочем столе и переключился на рабочий стол. Вы могли бы скрыть больше вещей (например, пусковую установку), но я все равно это скрыл.

Эта команда требует немного настройки.

Установить: xdotool - sudo apt-get install xdotool

Введите: xinput --listи запишите свои идентификаторы мыши и клавиатуры.

Я бы предложил редактировать эти команды в 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

Измените и на их соответствующие номера в обеих командах.

Для этого:

  • Отключает / включает клавиатуру
  • Отключает / Включает Мышь
  • Скрывает / показывает все значки на рабочем столе
  • Переключает показ вашего рабочего стола.

Одна важная вещь, которую нужно иметь в виду - это не может быть отменено без вашего устройства Bluetooth. Если по какой-то причине это не удается, вы должны перезагрузить. Из-за этого может быть целесообразно оставить клавиатуру включенной и настроить команду разблокировки на выбранный ярлык.

Тим
источник
Эй, хорошая идея! Можно ли изменить это так, чтобы любой ввод с клавиатуры блокировал экран (давая возможность разблокировать его без устройства Bluetooth) вместо игнорирования ввода с клавиатуры?
d_inevitable
Это даже лучше! Я как раз собирался опубликовать другую идею, но я начну работать над этим!
Тим
@d_inevitable Посмотрите на мой новый ответ, он аккуратнее (особенно 2-й метод). Я уверен, что это работает.
Тим
1

Итак, я решил, что «лучший» способ сделать это (апокрифический, поскольку мы все еще храним пароль и подделываем его, вводя его в текст ) - это, как я уже отмечал выше, зашифровать пароль для входного USB-ключа. Это немного грязный сценарий, поэтому я объясню, что происходит.

Перечислим устройства для текущего пользователя, просматривая /etc/pamusb.conf с xpath; каждый из них затем связывается со своим UUID с использованием xpath, а UUID сопоставляется с устройством с помощью blkid.

У вас есть выбор: заблокировать, разблокировать шоу-устройство или настроить ключ. Когда вы запустите установку, она создаст ~ / .ssh / pamusb_rsa, если она не существует. Затем вам будет предложено выбрать устройство (или нет, если оно есть) и ввести свой пароль. Ваш PW будет храниться в зашифрованном виде в {device} /. Pamusb / .auth.

Когда вы запускаете разблокировку, устройства снова перечисляются и проверяются одно за другим на наличие файла /.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
Fordi
источник
0

Обновить! Есть способ использовать обычный экран блокировки! Ура!

Я не знаю, насколько это безопасно (хранение вашего пароля в незашифрованном виде), но я думаю, что это лучшее из возможных.

Это команда блокировки: gnome-screensaver -d

Есть 2 команды разблокировки:

No1:

Это первая команда разблокировки:

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

Щелчок состоит в том, чтобы разбудить его (он должен щелкнуть внутри поля входа в систему из-за перемещения мыши) и показать новый красивый экран блокировки вместо «спящего» черного экрана.

Затем он вводит mypassword123!ввод, чтобы отправить его, в текстовое поле.

Важный. По какой-то причине - возможно, из-за того, для чего фактически предназначен xdotool (сочетания клавиш) - вы не можете вводить двойные буквы. Чтобы обойти это, разделите его на 2 команды в каждой двойной букве (как указано выше). Кроме того, числа должны иметь свою собственную, отдельную команду от букв (также выше). Наконец, модификаторы (такие как shift) требуют отдельного ключа, как и ключ Return.


No2:

Это второй. Это немного лучше и менее хакерски, но требует много настроек.

Сначала установите actionaz:

sudo apt-get install actionaz

Откройте новый скрипт и перетащите нужные элементы в свой поток. (Вы можете скачать готовый файл здесь . Если вы решили его скачать, откройте его, дважды щелкните здесь «Написать текст - Пароль» и введите свой пароль).

  1. Пауза: введите 3 секунды.
  2. Нажмите: скопируйте и вставьте 165:555в поле Положение. (В зависимости от стороны экрана это может отличаться. Убедитесь, что он щелкает в поле пароля, иначе он не работает).
  3. Введите текст: введите свой пароль в поле
  4. Ключ: нажмите на поле и нажмите Return

Сохраните его в своей домашней папке как unlock.ascr (или под любым именем - я просто не хотел рекламировать, что в нем есть мой пароль)

Настройте команду приближения так:

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

Движение мыши пробуждает его, и параметры говорят ему выполнить скрипт и затем выйти в конце.


Если вы потеряете свое устройство, вы всегда можете просто ввести свой пароль, чтобы он был обратимым.

Тим
источник
2
Эй, это выглядит довольно хорошо, но, к сожалению, сохранение пароля в чистом тексте не вариант. Это почти так же плохо - запускать все в корне, как мой пользователь в списке sudoers. Но я думаю, что сочетание ваших двух ответов сработает. Я попробую что-нибудь, как только смогу. По существу, затемнение экрана до тех пор, пока мышь не начнет двигаться, не будет нажата клавиша или устройство Bluetooth не вернется в зону действия. Если мышь перемещается или нажимается клавиша, снова включите экран и запустите его, gnome-screensaver-command -lчтобы можно было ввести пароль, когда устройство Bluetooth отсутствует. Я думаю, что это должно быть выполнимо.
d_inevitable
Я быстро посмотрел на опцию «перемещения мыши» ... Я думал, что xev мог бы сделать это? Вы можете настроить его так, чтобы мышь перемещалась по окну xev, и если вывод меняется, вы знаете, что что-то имеет получилось.
Тим
Согласитесь, хранить пароль в виде обычного текста довольно плохо. Если ваш homedir зашифрован - я думаю, что сейчас это Ubuntu по умолчанию, - это сделало бы его немного менее опасным. Я немного поиграл с этим, и на самом деле нашел решение №1 намного проще, и на самом деле не считаю все это хакерским. Сделал небольшое изменение, хотя. Вместо того, чтобы двигать мышью, я вставляю его, так gnome-screensaver -dкак он все еще пробуждает экран и позволяет мне сделать его намного короче sleep(я установил его сейчас на 0,1, но удивляюсь, нужен ли он вообще)
Wouter Van Vliet
Я думал, что мог бы написать файл на ключе с моим паролем, зашифрованный с помощью моего ключа из .ssh / id_rsa, и написать скрипт для расшифровки и ввести его для входа в систему. Я дам вам знать, если у меня будет успех.
Fordi