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

xwmevbvl  于 2023-03-30  发布在  Shell
关注(0)|答案(1)|浏览(148)

我尝试使用.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)"

Q1:如何让终端在执行full命令后关闭?

此外,这个更简单的语法(在""中)可以被.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行所示:

不带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中不起作用

fhg3lkii

fhg3lkii1#

  • 您应该传递命令以在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中没有什么特别之处--只需要将上面的命令用双引号括起来。

相关问题