【问题标题】:Run a Ruby Script with Python使用 Python 运行 Ruby 脚本
【发布时间】:2016-03-17 06:32:33
【问题描述】:

我有一个 Ruby 脚本,当我在 shell 中运行时它可以工作(作为用户):

/home/user/wpscan/$ ruby ./wpscan.rb -u www.mysite.com

但是,我想使用我用 Python 创建的函数自动执行此操作。这是python脚本:

#!/usr/bin/python

import os
wpscan_env = "/wpscan/"
os.chdir(os.environ['HOME'] + wpscan_env)
os.system("ruby ./wpscan.rb -u www.mysite.com")

请注意,Python 脚本位于不同的文件夹 home/user/python/first.py,这就是我执行 os.chdir() 函数的原因。当我回到 shell 并输入:

/home/user/python/$ python first.py

这是我得到的输出:

在任何来源中都找不到 addressable-2.4.0

运行 `bundle install` 来安装缺失的 gem。

我使用的是 Ubuntu 14.04,为了让 wpscan 正常工作,它要求我安装 Ruby 2.3.0。我是通过 RVM 完成的。

wpscan.rb 有一些依赖项,它似乎没有实例化它们。另外,如果我在 wpscan 文件夹中并执行 ruby ./wpscan.rb ... 它将起作用。但是,如果我尝试从主目录执行此操作:ruby wpscan/wpscan.rb ... 它会引发错误:

[ERROR] 无法加载此类文件 --typhoeus

[提示] 尝试运行“gem install typhoeus”或“gem install --user-install typhoeus”。如果仍然出现错误,请查看 README 文件或https://github.com/wpscanteam/wpscan

我对 Ruby 一无所知,这是我的第一个真正的 Python 脚本,我在 2 晚前刚刚安装了 wpscan。我在这里已经脱离了我的联盟,我需要帮助。任何进一步的问题都可以根据请求详细说明。

【问题讨论】:

  • 尝试运行bundle install或类似gem install addressable --version 2.4.0的东西
  • 如果我在 shell 中执行该命令,它可以工作并且不会向我显示此错误。我还应该尝试吗?
  • 如果您在没有 Python 的情况下也无法运行 Ruby 命令,例如得到同样的错误,那么这几乎不是任何 Python 问题
  • 不,我想你误会了。 ruby ./wpscan.rb -u ... 在外壳中工作。但在 Python 中,它会输出错误。
  • 您是否在每个目录的基础上指定 ruby​​ / gemset 版本?确保您不会意外使用不同的 ruby​​ 版本(需要为每个版本重新安装 gem)。如果您的 root 用户有不同的 ruby​​ 版本(这是常见且预期的),也可以尝试 sudo gem install

标签: ruby


【解决方案1】:

很可能,python 脚本中的 ruby 与 shell 中的 ruby 不同。这可能会发生,例如安装了默认的系统 ruby​​(例如,从系统包中),然后通过 RVM 安装另一个 ruby​​ 版本。

使用 shell 时,RVM 会自动从 shell 初始化脚本(例如 ~/.bashrc)加载其环境,并从其设置中知道要使用哪个 ruby​​。而您的 python 脚本不加载任何 rvm 环境(它不是登录 shell)并调用默认系统 ruby​​。

在这种情况下,您需要在 Python 脚本中从 RVM 显式调用正确的 ruby​​。您可以通过调用 RVM 包装器来实现它:

  • 浏览~/.rvm/wrappers/ 下的目录并找到您要使用的正确 ruby​​ 版本和 gemset
  • 在您的 python 脚本中,从这个包装目录调用ruby 命令,而不是普通的 `ruby,类似于:
rvm_ruby = os.environ['HOME'] + "/.rvm/wrappers/ruby-2.3.0-p100@myproject/ruby"
os.system(rvm_ruby + " ./wpscan.rb -u www.mysite.com")

这应该可以解决您的问题。

【讨论】:

  • 我尝试了你的答案并得到了sh: 1: /home/user/.rvm/wrappers/ruby-2.3.0@wpscan: Permission denied 错误。
  • ruby 是否在 rvm_ruby 字符串的末尾?即您是否可能试图调用包装器目录本身?
  • 不,我没有!感谢您的简洁回答。我在变量中添加了/ruby,它就像一个魅力!你刚刚为我节省了几个小时的工作时间!
  • @BlackBeltScripting 那么你也可以考虑接受 BoraMa 的回答
【解决方案2】:

从 python 执行 ruby​​ 脚本就是这么简单......

import os
os.system('ruby filename.rb')
#if you want to store the output in seperate file
os.system('ruby filename.rb > outfilename.txt)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 2014-10-19
    • 2017-07-30
    相关资源
    最近更新 更多