web-dev-qa-db-ja.com

`gnome-screensaver-command`を使用せずに14.04で画面のロックを解除する

13.10ではblueproximityを喜んで使用していましたが、14.04にアップグレードしてから、携帯電話が範囲外になったとき(gnome-screensaver-command -lを使用)のみロックしますが、gnome-screensaver-command -dではロック解除されません。

gnome-screensaver-command -dが機能しない理由は、 バグ が原因です。

ただし、そのバグレポートでは、gnome-screensaverが信頼性の高いものとして使用されなくなったため、gnome-screensaver-commandが段階的に廃止される予定であり、コマンドが機能しない理由に関連している可能性があります。

私の質問は、gnome-screensaverが置き換えられた場合、gnome-screensaver-commandに依存せずに画面のロックを解除する新しいコマンドはどうなるかということです。

10
d_inevitable

これは私のために働いた:

コマンドラインで:

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

最初にサインインすると画面キーボードが表示されますが、閉じることができます。

この後gnome-screensaver-command -dは機能します。

https://bugs.launchpad.net/ubuntu/+source/gnome-screensaver/+bug/130716 でbenshaydenから取得

6
Toby Abel

残念ながらこれを行う方法はありません:(

更新-方法を見つけました。私の 新しい回答をチェックしてください

これは私の以前の解決策です-使用することはお勧めできません。携帯電話を紛失してもロック解除できません。ロックを解除するには再起動する必要があります

私は最終的に解決策を思い付きました-そもそもそれをロックしないでください。これは奇妙に聞こえるかもしれません-耐えてください。

ロックする代わりに、マウスとキーボードを無効にし、すべてのデスクトップアイコンを非表示にして、デスクトップに切り替えました。 (ランチャーなど)より多くのものを非表示にすることもできますが、とにかく非表示にします。

このコマンドには少しセットアップが必要です。

インストール: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

両方のコマンドでとをそれぞれの番号に変更します。

これを順番に:

  • キーボードを無効/有効にします
  • マウスを無効/有効にします
  • すべてのデスクトップアイコンを非表示/表示します
  • デスクトップの表示を切り替えます。

念頭に置いておくべき重要なことの1つは、Bluetoothデバイスがないと元に戻せないことです。何らかの理由で失敗した場合は、再起動する必要があります。そのため、キーボードを有効にして、選択したショートカットにロック解除コマンドを設定することをお勧めします。

3
Tim

したがって、私はこれを行うための「最良の」方法を考え出しました(私はまだパスワードを保存しているので、暗号化されていませんものに入力することを偽装します)、上記でコメントしたように、パスワードを暗号化しますtoエントリUSBキー。スクリプトは少し複雑なので、何が起こっているのかを説明します。

現在のユーザーのデバイスは、xpathで/etc/pamusb.confを調べることにより列挙されます。次に、それぞれがxpathを使用してUUIDと結合され、Ukidがblkidを使用してデバイスにマップされます。

ロック、ショーデバイスのロック解除、またはキーのセットアップを選択できます。セットアップを実行すると、〜/ .ssh/pamusb_rsaが存在しない場合は作成されます。次に、デバイスを選択する(または、デバイスが1つしかない場合は選択しない)ように求められ、パスワードを入力します。 PWは{device} /。pamusb/.authに暗号化されて保存されます。

ロック解除を実行すると、デバイスが再度列挙され、/。pamusb/.authファイルを1つずつ確認します。発見された場合、復号化が試みられ、成功した場合、その時点でテキストを受け入れるものにパスワードを入力するために使用されます。 のみセッションがロックされているときに実行を許可します。

これに〜/ .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
1
Fordi

更新!通常のロック画面を使用する方法があります!イェーイ!

パスワードの安全性(パスワードをプレーンテキストで保存すること)はわかりませんが、可能な限り最高だと思います。

これはロックコマンドです:gnome-screensaver -d

2つのロック解除コマンドがあります:

No1:

これは最初のロック解除コマンドです。

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

クリックすると、スリープが解除され(マウスの動きによりログインボックス内をクリックする)、「スリープ」状態の黒い画面ではなく、ニースの新しいロック画面が表示されます。

次に、mypassword123!を入力して入力し、送信するためにテキストボックスに入力します。

重要。何らかの理由で-おそらくxdotoolの実際の使用目的(キーボードショートカット)のために-2文字を入力することはできません。これを回避するには、2文字ごとに2つのコマンドに分割します(上記を参照)。また、数字には文字とは別の独自のコマンドが必要です(上記も同様)。最後に、Returnキーと同様に、修飾子(Shiftなど)には別の修飾子が必要です。


No2:

これは2番目です。それは少し良くてハックが少ないですが、多くの設定が必要です。

最初にactionazをインストールします:

Sudo apt-get install actionaz

新しいスクリプトを開き、正しいアイテムをフローにドラッグします。 (完成したものをダウンロードできます here 。これをダウンロードすることを選択した場合は、それを開き、[テキストの書き込み-ここにパスワード]をダブルクリックし、パスワードを入力します)。

  1. 一時停止:3秒を入力します。
  2. クリック:165:555をコピーして[位置]ボックスに貼り付けます。 (画面側に応じて、これは異なる場合があります。パスワードボックスをクリックするようにしてください。クリックしないと機能しません)。
  3. テキストを書く:ボックスにパスワードを入力します
  4. キー:ボックスをクリックしてReturnキーを押します

Unlock.ascr(または任意の名前-パスワードが入っていることを宣伝したくなかった)としてホームフォルダーに保存します。

近接コマンドを次のように設定します。

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

マウスを動かすと目が覚め、オプションによってスクリプトが実行され、最後に終了するように指示されます。


デバイスを紛失した場合は、いつでもパスワードを入力できるため、元に戻すことができます。

0
Tim