我正在尝试创建一个“别名”以在单独的终端中运行服务器,然后几秒钟后打开它的客户端,这是我正在尝试的命令:
alias kingp='xterm -e sudo /opt/king-phisher/KingPhisherServer -L INFO -f /opt/king-$/king-phisher/server_config.yml; /opt/king-phisher/KingPhisher'
问题在于,在我关闭服务器(CTRL+C)之前,它不会运行第二个命令,然后它正常运行客户端,我尝试在服务器命令末尾使用 & 和 &&,但无济于事,似乎服务器即使使用 -e 运行仍然无法释放终端以运行其他命令,我之前使用 -e 成功过,不知道为什么在别名中它不起作用,有人可以帮助我吗?非常感谢你们。
答案1
问题在于别名首先由 Bash 解释,然后由 XTerm 解释。
Bash 将整个别名解释为两个单独的命令:xterm -e sudo /opt/king-phisher/KingPhisherServer -L INFO -f /opt/king-$/king-phisher/server_config.yml
和/opt/king-phisher/KingPhisher
,并且在当前 shell 中依次执行这两个命令。
使用&
而不是;
不会有帮助,因为 Bash 仍会解释&
;转义;
或&
也不会有帮助,因为 XTerm 没有 Bash 语法的概念,并且会将;
或&
作为参数传递给/opt/king-phisher/KingPhisherServer
(以及命令的其余部分,/opt/king-phisher/KingPhisher
)。
唯一的解决方案是告诉 XTerm 调用 Bash 并让 Bash 进行解析:
alias kingp="xterm -e bash -c 'sudo /opt/king-phisher/KingPhisherServer -L INFO -f /opt/king-$/king-phisher/server_config.yml & /opt/king-phisher/KingPhisher'"
除非用户不需要提供sudo
密码即可运行/opt/king-phisher/KingPhisherServer
,否则这将导致服务器无法启动,因为sudo
命令在能够读取密码之前被后台运行;请参阅此处了解可能的解决方案:如何在后台运行需要输入密码的 sudo 命令?。