我试图在我的Rails应用程序中运行一个c++可执行文件,该应用程序位于一个名为"algo"的文件夹中,如下所示:
result = `cd algo && ./my_main #{str} -1 -1 #{id}`
在开发中可以完美地运行,但在云中的生产中不能运行
认为:
1)在云中,这是一个虚拟机,我运行相同的可执行文件没有问题,在控制台终端导航通过Rails应用程序文件夹,只有当我试图从Rails应用程序运行它时才失败
2)
Rails.logger.info result
返回什么
3)
Rails.logger.info `pwd`
返回项目的当前文件夹
4)
Rails.logger.info $?
只返回:pid 35314 exit 127
5)
Rails.logger.info File.exist?("algo/my_main")
返回true
6)config/environments/production.rb
中日志级别为config.log_level = :info
7)在log/production.log
中没有出现任何错误,就像您在开发终端
8)我也尝试使用其他命令,如:system()
, exec()
, %x()
与相同的结果
9)最后,我在虚拟机中运行sudo chmod -R 777
,在Rails文件夹应用程序之前的主文件夹中,我认为这是隐含在第1点中,但为了澄清
对于脚本将要执行的任何代码,应该始终使用绝对路径。对于执行脚本的用户,PATH
变量可能与您使用的用户不同,并且100%精确地确定您想要的文件路径比依赖PATH
要好得多。
同样,确保运行Rails服务器的用户对脚本具有执行权限。如果有疑问,请以该用户身份登录并尝试执行该脚本。
出于安全原因,您还需要转义str
和id
。即使这些变量当前不是以任何方式从提交的参数中派生出来的,也始终存在这样一种可能性,即包含此代码的任何函数都可能在某个时候使用用户提交的变量执行。基本上,安全总比后悔好,因为这是一种安全漏洞,可以允许互联网上的任何人在您的服务器上执行任意代码。