我正在尝试使用.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行:
没有 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中不起作用。
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$(...)
中包装你的命令?你真的期望那个长管道输出一个要执行的命令的名称吗? - tripleeegnome-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)"`。 - tripleeezenity
的对话框实用程序呢? - tripleee