执行.xbindkeysrc中的命令后退出终端。

3

我正在尝试使用.xbindkeysrc将命令绑定到一个按键上,具体来说,这个命令会从keepassxc中获取密码,并将其作为stdin回显给openconnect(用于VPN连接)命令,最后关闭终端。下面的代码实现了所有这些功能,并且它是有效的:

psswd=`keepassxc-cli show -sa password path/to/MYKEEPASS.kdbx MY_ENTRY` ; echo $psswd | sudo openconnect --background --protocol=gp https://my.url --user=MYUSERNAME --passwd-on-stdin ; exit

然而,在 .xbindkeysrc 中,这不能作为一个命令运行,它需要在终端中执行,可以通过将上述代码放在 "$()" 中来完成(同样可行),但是不需要 "; exit" 这最后一部分(带有它不起作用),因此终端在运行完整个命令后不会关闭。
gnome-terminal -e "$(psswd=`keepassxc-cli show -sa password path/to/MYKEEPASS.kdbx MY_ENTRY` ; echo $psswd | sudo openconnect --background --protocol=gp https://my.url --user=MYUSERNAME --passwd-on-stdin)"

问题1:如何告诉终端在执行完整个命令后关闭?

此外,这种更简单的语法(在""内)也可以被.xbindkeysrc理解:

"gnome-terminal -e "sudo openconnect --protocol=gp https://my.url --user=MYUSERNAME""

但是仅仅在完整命令中添加""并不足以让.xbindkeysrc在我按下绑定的键时运行它;这导致了我的第二个问题:

Q2:如何将完整命令集成到.xbindkeysrc中?

非常感谢。


编辑:使用Grisha Levit的答案后:

"gnome-terminal -- sh -c 'pass=$(keepassxc-cli show -a password my_keepass_DB my_ENTRY) && printf "%s\n" "$pass" | sudo openconnect --background --protocol=gp https://my.url --user=my_NAME --passwd-on-stdin'"

vpnc-script 出现问题,问题出现在第2行和第5-7行:

Lines 2,5-7 are showing an error

没有 gnome-terminal -- 的部分是可以工作的:

sh -c 'pass=$(keepassxc-cli show -a password my_keepass_DB my_ENTRY) && printf "%s\n" "$pass" | sudo openconnect --background --protocol=gp https://my.url --user=my_NAME --passwd-on-stdin'

但这在.xbindkeysrc中不起作用。


1
这是哪个版本的 gnome-terminal?我的会提示 Option "-e" is deprecated and might be removed in a later version of gnome-terminal.。话说,你知道 sh -c 'echo foo; echo bar | cat' 吗?你可以在 .xbindkeysrc 中使用这种“内联”脚本。 - Fravadona
1
你为什么要在 $(...) 中包装你的命令?你真的期望那个长管道输出一个要执行的命令的名称吗? - tripleee
@tripleee 我只是在包装第一部分:pass=$(keepassxc-cli show -a password my_keepass_DB my_ENTRY) ... - Miguel
你的问题展示了命令行 gnome-terminal -e "$(psswd=\keepassxc-cli show -sa password path/to/MYKEEPASS.kdbx MY_ENTRY` ; echo $psswd | sudo openconnect --background --protocol=gp https://my.url --user=MYUSERNAME --passwd-on-stdin)"`。 - tripleee
@tripleee,我正在使用我帖子末尾提到的EDIT注释中建议的命令。 - Miguel
1
需要一个终端来处理本质上是GUI的东西似乎有些绕弯。您能否使用类似zenity的对话框实用程序呢? - tripleee
1个回答

2
  • 你应该将要运行的命令作为位置参数传递给gnome-terminal,而不是使用-e选项。(即gnome-terminal -- cmd arg...
  • 你不能直接使用shell语法,必须通过例如sh -c

因此,命令可能如下:

gnome-terminal -- sh -c 'pass=$(keepassxc-cli show -a password DB ENTRY) && printf "%s\n" "$pass" | sudo openconnect --background --passwd-on-stdin …'

如果这样做可以的话,在启动openconnect命令后,终端应该会自动退出,所以不需要使用exit命令。

在 .xbindkeysrc 中使用这个命令并没有什么特别之处,只需要将上面的命令用双引号括起来即可。


1
令人惊讶的是,在.xbinkeysrc文件中,双引号不需要转义或任何特殊处理。我最初打算建议使用管道传输密码,但后来认为最好先捕获它,只有在该部分工作正常时才继续,而不是在KeePass命令失败的情况下传输空字符串。 - Grisha Levit
谢谢,它正在运行,但最后“异常退出”,请查看我的编辑中的截图(抱歉,我不得不截屏,因为它发生得太快了,无法复制文本)。 - Miguel
1
这似乎是特定于在关闭的终端中运行 openconnect --background 的问题——如果您可以将没有 xkeybindrc 文件的单独问题缩小,那可能会更好。 - Grisha Levit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接