Desbloquee la pantalla en 14.04 sin `gnome-screensaver-command`

10

He estado felizmente usando blueproximity en 13.10, pero desde la actualización a 14.04 solo se bloquea cuando mi teléfono sale del alcance (usando gnome-screensaver-command -l), pero no se desbloquea con gnome-screensaver-command -d.

Ahora la razón que gnome-screensaver-command -dno funciona es por un error .

Sin embargo, en ese informe de error se menciona que el gnome-screensaver ya no se usa con confianza y, por lo tanto, gnome-screensaver-commandse espera que se elimine gradualmente, lo que también podría estar relacionado con por qué el comando no funciona.

Entonces mi pregunta es, si se reemplaza el gnome-screensaver, ¿cuál sería el nuevo comando para desbloquear la pantalla sin depender gnome-screensaver-command?

d_inevitable
fuente
@Braiam Esta pregunta es específica de 14.04 y posterior. ¿Por qué eliminaste la etiqueta? ¡No hay razón para evitar usarlo gnome-screensaver-commanden versiones anteriores!
d_inevitable
Usted mismo respondió: 14.04 y más tarde . 14.04 debe usarse solo si esa es la única versión afectada, lo cual no es cierto ya que 14.10 lo tiene. Por cierto, no pregunte sobre errores.
Braiam
@Braiam 1. ¡No sé más tarde! ¿Cómo puedo? No hay una versión posterior todavía. A partir de ahora es solo 14.04. Y no pregunté sobre errores. Entonces, si no te importa, revertiré tu edición.
d_inevitable
¿Seriamente? cdimage.ubuntu.com/daily-live/current pruébalo.
Braiam
1
@Braiam que no es un lanzamiento.
d_inevitable

Respuestas:

6

Esto funcionó para mí:

En la línea de comando:

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

El teclado en pantalla aparece cuando inicia sesión por primera vez, pero puede cerrarlo.

Después de esto gnome-screensaver-command -dfunciona.

Tomado de benshayden en https://bugs.launchpad.net/ubuntu/+source/gnome-screensaver/+bug/1307163

Toby Abel
fuente
Esto debería ser mucho más alto que las otras respuestas. No debe poner su contraseña en estos scripts, ¡esto es realmente malo!
Patrick Cornelissen
3

Desafortunadamente, no hay forma de hacerlo :(

Actualización: he encontrado una manera. Mira mi nueva respuesta

Esta es mi solución anterior: no se recomienda su uso, no se puede desbloquear si pierde su teléfono; tienes que reiniciar para desbloquearlo

Finalmente se me ocurrió una solución: no la bloquee en primer lugar. Esto puede sonar extraño, tenga paciencia.

En lugar de bloquearlo, desactivé el mouse y el teclado, oculté todos los íconos del escritorio y luego cambié al escritorio. Posiblemente podría ocultar más cosas (como el lanzador) pero de todos modos lo tengo oculto.

Este comando requiere un poco de configuración.

Instalar: xdotool - sudo apt-get install xdotool

Ingrese: xinput --listy anote los identificadores de su mouse y teclado.

Sugeriría editar estos comandos en gedit

Este actúa como el casillero.

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

Esto actúa como el desbloqueo.

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

Cambie el y a sus respectivos números, en ambos comandos.

Para esto:

  • Deshabilita / habilita el teclado
  • Deshabilita / habilita el mouse
  • Oculta / muestra todos los íconos de tu escritorio
  • Alterna mostrando tu escritorio.

Una cosa importante a tener en cuenta: esto no se puede deshacer sin su dispositivo bluetooth. Si por alguna razón falla, debe reiniciar. Debido a eso, puede ser aconsejable dejar el teclado habilitado y configurar el comando de desbloqueo para un atajo elegido.

Tim
fuente
Hola buena idea! ¿Sería posible cambiar de modo que cualquier entrada de teclado bloquee la pantalla en su lugar (dando la posibilidad de desbloquearla sin el dispositivo bluetooth) en lugar de ignorar toda entrada de teclado?
d_inevitable
¡Eso es aún mejor! Estaba a punto de publicar otra idea, ¡pero trabajaré en eso!
Tim
@d_inevitable Echa un vistazo a mi nueva respuesta, es más ordenada (especialmente el segundo método). Estoy bastante seguro de que funciona.
Tim
1

Entonces, pensé que la "mejor" forma de hacerlo (apócrifo, ya que todavía estamos almacenando una contraseña y fingiendo escribirla ) sería, como comenté anteriormente, cifrar la contraseña en la llave USB de entrada. Es un guión un poco desordenado, así que explicaré lo que está sucediendo.

Los dispositivos para el usuario actual se enumeran mirando /etc/pamusb.conf con xpath; cada uno se empareja con su UUID usando xpath, y el UUID se asigna a un dispositivo usando blkid.

Tiene la opción de bloquear, desbloquear mostrar dispositivo o configurar su clave. Cuando ejecutas la configuración, creará ~ / .ssh / pamusb_rsa si no existe. Luego se le pedirá que elija un dispositivo (o no, si solo hay uno) y que ingrese su contraseña. Su PW se almacenará, encriptará, en {dispositivo} /. Pamusb / .auth.

Cuando ejecuta Desbloquear, los dispositivos se enumeran nuevamente y se verifica uno por uno para obtener un archivo /.pamusb/.auth. Cuando se detecta, se intentará descifrar y, si tiene éxito, se usará para escribir su contraseña en lo que sea que esté aceptando texto en este momento. Será solamente permiso de funcionar cuando la sesión está bloqueada, por lo que es de esperar, esto no va a exponer a usted demasiado malo.

Llamé a esto ~ / .bin / unity-lock-control (~ / .bin está en mi camino), y tengo "unit-lock-control lock" y "unity-lock-control unlock" como mis agentes en pam.conf .

#!/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
fuente
0

¡Actualizar! ¡Hay una manera de usar la pantalla de bloqueo normal! ¡Hurra!

No sé qué tan seguro es (almacenar su contraseña en texto sin formato), pero creo que es la mejor posible.

Este es el comando de bloqueo: gnome-screensaver -d

Hay 2 comandos de desbloqueo:

No1:

Este es el primer comando de desbloqueo:

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

El clic es para activarlo (debe hacer clic dentro del cuadro de inicio de sesión, debido al movimiento del mouse) y mostrar la nueva pantalla de bloqueo agradable, en lugar de la pantalla negra "dormida".

Luego escribe mypassword123!con un enter, para enviarlo, en el cuadro de texto.

Importante. Por alguna razón, probablemente por lo que xdotool está destinado a ser realmente utilizado (atajos de teclado), no puede ingresar letras dobles. Para evitar esto, divídalo en 2 comandos en cada letra doble (como arriba). Además, los números deben tener su propio comando separado de las letras (también arriba). Finalmente, los modificadores (como shift) necesitan uno diferente, al igual que la tecla Retorno.


No2:

Este es el segundo. Es un poco mejor y menos agresivo, pero requiere mucha configuración.

Primero instala actionaz:

sudo apt-get install actionaz

Abra una nueva secuencia de comandos y arrastre los elementos correctos a su flujo. (puede descargar la completa aquí . Si elige descargar esto, ábralo, haga doble clic en Escribir texto - Contraseña aquí e ingrese su contraseña).

  1. Pausa: ingrese 3 segundos.
  2. Haga clic: copie y pegue 165:555en el cuadro Posición. (Dependiendo del lado de la pantalla, esto puede ser diferente. Asegúrese de que está haciendo clic en el cuadro de contraseña, de lo contrario no funciona).
  3. Escribir texto: ingrese su contraseña en el cuadro
  4. Clave: haga clic en el cuadro y presione Retorno

Guárdelo en su carpeta de inicio como unlock.ascr (o cualquier nombre, simplemente no quería anunciar que tenía mi contraseña)

Configure su comando de proximidad para ser:

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

El movimiento del mouse lo despierta, y las opciones le indican que ejecute el script y luego salga al final.


Si pierde su dispositivo, siempre puede escribir su contraseña, por lo que es reversible.

Tim
fuente
2
Oye, esto se ve bastante bien, pero desafortunadamente almacenar la contraseña en texto limpio no es una opción. Es casi tan malo ejecutar todo en la raíz como mi usuario está en la lista de sudoers. Pero creo que una combinación de sus dos respuestas funcionaría. Probaré algo tan pronto como pueda. Básicamente, atenúe la pantalla hasta que el mouse se mueva, se presione una tecla o el dispositivo bluetooth vuelva a estar dentro del alcance. Si el mouse se mueve o se presiona la tecla, vuelva a encender la pantalla y ejecútela gnome-screensaver-command -lpara que se pueda ingresar una contraseña mientras el dispositivo Bluetooth está ausente. Creo que debería ser factible.
d_inevitable
Miré rápidamente la opción de 'mover el mouse' ... ¿Estaba pensando que xev podría hacerlo? sucedió
Tim
De acuerdo, almacenar la contraseña en texto plano es bastante malo. Sin embargo, tener su homedir encriptado, como creo que es el predeterminado ahora en Ubuntu, lo haría un poco menos malo. He jugado un poco con él, y en realidad encuentro la solución # 1 mucho más fácil, y realmente no lo considero tan hackear. Sin embargo, hizo un pequeño cambio. En lugar del mousemove, lo puse gnome-screensaver -dya que todavía despierta la pantalla y me permite tener un tiempo mucho más corto sleep(lo configuré ahora en 0.1, pero me pregunto si es necesario)
Wouter Van Vliet
Estaba pensando que podría escribir un archivo en la clave con mi contraseña, cifrado con mi clave de .ssh / id_rsa, y escribir un script para descifrarlo e ingresarlo para iniciar sesión. Te haré saber si tengo algún éxito.
Fordi