我正在尝试在我的Rails应用程序中运行C ++可执行文件,该应用程序位于名为“algo”的文件夹中,如下所示:
eval
在开发工作中完美无缺,但在云端的生产中却无法运行
考虑一下:
1)在云中,这是一个虚拟机,我在控制台终端中运行相同的可执行文件而没有问题导航到Rails应用程序文件夹,它只在我尝试从Rails应用程序运行它时失败
2)
result = `cd algo && ./my_main #{str} -1 -1 #{id}`
什么都不返回
3)
Rails.logger.info result
返回proyect的当前文件夹
4)
Rails.logger.info `pwd`
仅返回:pid 35314退出127
5)
Rails.logger.info $?
返回 Rails.logger.info File.exist?("algo/my_main")
6)
在true
中,日志级别为config/environments/production.rb
7)
在config.log_level = :info
中没有出现任何错误,就像您将在终端的开发中看到的那样
8)
我还尝试使用其他命令,例如:log/production.log
,system()
,exec()
,结果相同
9)
最后,我在虚拟机中运行%x()
,在Rails文件夹应用程序之前的主文件夹中,我认为这是隐含在第1点,但为了澄清
答案 0 :(得分:1)
对于将由脚本执行的任何代码,您应始终使用绝对路径。 PATH
变量对于执行脚本的用户可能与您使用的用户不同,并且对于您想要的文件路径而言要比对PATH
更加准确100%。
同样,确保运行Rails服务器的用户对脚本具有执行权限。如果有疑问,请以该用户身份登录并尝试执行该脚本。
出于安全原因,您还需要同时转义str
和id
。即使这些变量不是以提交参数的任何方式从当前派生的,但总是有可能包含此代码的任何函数都可能在某个时刻使用用户提交的变量执行。基本上,安全比抱歉更好,因为这是一种安全漏洞,可以让互联网上的任何人在您的服务器上执行任意代码。