如何使用 Qt 在另一台设备中启动和停止外部程序?
Posted
技术标签:
【中文标题】如何使用 Qt 在另一台设备中启动和停止外部程序?【英文标题】:How to start and stop an external program in another device using Qt? 【发布时间】:2015-04-08 13:30:32 【问题描述】:我正在开发一个固件更新程序,它应该从 Web 服务器下载数据并将其上传到嵌入式 Linux 设备。
我希望一个程序(客户端)在它们之间建立连接并开始发送数据之前启动另一个程序(服务器)。在同一环境中执行此操作很容易:只需调用 QProcess
和 startDetached()
,但我想远程执行此操作:我想在 Desktop 机器中启动客户端,并通过 ETH/TCP 连接设备已知 IP 地址,单击将要求设备启动服务器的按钮。当服务器完成启动并开始等待连接时,桌面应用程序将打开套接字连接并开始发送数据。发送完所有数据后,再发送一条命令请求关闭服务器,关闭连接并完成文件传输操作。
我的问题是:当应用程序位于不同的机器(在嵌入式 Linux 设备中,而调用者在 PC 中)时,我如何执行请求启动或停止的操作强>?请注意,解决方案必须不依赖于一些额外的软件(例如 Tcp 服务器)在设备上持续运行——这正是我要避免的。
【问题讨论】:
【参考方案1】:这与 Qt 没有任何关系,因为它没有为此提供任何东西。 从这一点开始至少有两条路径:
使用应用程序中的 SSH 启动远程计算机中的任何进程:ssh user@remote-machine "any command here"
。这可以使用 QProcess 调用;
或
编写另一个软件来监听套接字命令并启动/停止您想要的任何进程,然后让它一直在远程机器上运行。然后,只需更改您的客户端软件即可发送相关命令
当心允许机器执行来自外部源的任意命令可能引起的任何安全问题。
【讨论】:
好吧,你的第二点对我来说没有多大意义:我想要做的就是避免在设备上运行一个额外的应用程序(如果是 FTP 服务器):我想打开它仅在我需要使用它的时候使用。因此,如果您的解决方案取决于第二点(如果确实如此,我不清楚),它对我不起作用:) 顺便说一句,对ssh
的调用究竟如何?我在 google 上发现了一些关于如何将 ssh 与 QProcess 一起使用的线程(forum.qt.io/topic/3788/qprocess-ssh-write-password/5 / ***.com/questions/20743793/… / qtforum.org/article/35299/qprocess-and-ssh.html ),但我并不清楚。
您可以使用一种解决方案或另一种解决方案(不能同时使用两者)。将 ssh 用于命令的最佳方式是将运行本地应用程序的用户的公钥添加到远程机器的 ~/.ssh/authorized_keys 中。这样就不会询问密码了
您可能必须使用 ssh 的完整路径,例如 /usr/bin/ssh。在您的机器中使用whereis ssh
为您找到准确的路径
cd /media/mmcblk0p2/bin ./FTPTester& 不是有效命令。我猜你忘了分开然后使用 ;或 &&。试试:/usr/bin/ssh root@10.1.25.11 "cd /media/mmcblk0p2/bin && ./FTPTester&"。为简单起见,我想先尝试不带 & 以上是关于如何使用 Qt 在另一台设备中启动和停止外部程序?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Fbs/PyInstaller 冻结我的应用程序导致在另一台电脑上启动时无法执行 pyi_rth_qt5plugins