X 屏幕储物柜很好,但有时我也想锁定其他 TTY 上打开的内容。出于这个原因,我想vlock -a
同时锁定所有 TTY。但是,当我想要运行此命令时,我通常处于 X 会话中。
vlock
无法从 X 内部运行,因为它抱怨当前终端不是虚拟控制台。我尝试制定一些解决方案chvt
,但我不知道如何在该控制台中运行命令。
如何在不退出 X 的情况下锁定所有 TTY(最好使用vlock
,但我愿意接受其他建议)?
答案1
请参阅此命令行选项:
-n,--new
Switch to a new virtual console before locking all console sessions.
我总是做的是sudo vlock -ans
,在 Xorg 内部/外部工作。
解锁后会跳回原来的VT。
编辑
遗憾的是,Arch Linux 将原来的 vlock 包替换成了 package 提供的包kbd
。那个只能锁定当前控制台,这对你来说毫无用处。 (都不-a -n -s
支持,唉)
解决方法可能很棘手,您必须手动安装原始 vlock,并屏蔽kbd
升级pacman.conf
答案2
如果你不打算使用vlock
,你应该看看physlock
。 Physlock 的功能正是您所寻找的:它切换到新的 VT,锁定它并禁用控制台切换。解锁后,您将返回到调用它时所在的任何控制台(并且可以从 X 或 TTY 调用它)。
它有很多选项,并且仍然非常轻量;实际上,我将它与xautolock
.
答案3
太长了;博士你的想法chvt
几乎是正确的这是命令行
sudo openvt -s -- sudo -u "$(whoami)" "$SHELL" -c \
'vlock -a; chvt '"$(sed 's/^tty//' < /sys/devices/virtual/tty/tty0/active)"
它用于openvt -s/--switch
在新打开的 tty 上运行 vlock,并在解锁之前通过检索的 tty /sys/devices/virtual/tty/tty0/active
(即运行 X 的 tty)后切换回来。
很长的故事
而你的问题的标题
us[e] vlock 而不改变 X 的 VT
似乎表明您需要一个防止更改的答案vt
/tty
看来您仍然想要该vlock -a
功能并尝试chvt
。这个答案提供了一个遵循您最初想法的解决方案chvt
。
# get the currently active tty
# (via https://unix.stackexchange.com/q/554600/24394)
ACTIVE_TTY="$(cat /sys/devices/virtual/tty/tty0/active)"
# get current user
ACTIVE_USER="$(whoami)"
# get the current shell or fallback
test -x "$SHELL" && ACTIVE_SHELL="$SHELL" || ACTIVE_SHELL="/bin/bash"
# 1. sudo open and switch to new tty
# 2. sudo run as ACTIVE_USER the ACTIVE_SHELL with
# 3. vlock -a to lock down
# 4. and upon unlock print unlocked and
# 5. switch back to previous shell
sudo openvt --switch --\
sudo -u "$ACTIVE_USER" "$ACTIVE_SHELL" -c \
'vlock -a; echo unlocked; chvt '"${ACTIVE_TTY/tty/}"
sudo openvt --switch -- sudo -u "$(whoami)" "$SHELL" -c 'vlock -a; chvt '"$(sed 's/^tty//' < /sys/devices/virtual/tty/tty0/active)"