我编写了一个ruby脚本,它在firefox中打开dlink管理页面并进行ADSL连接或断开连接。
我可以在终端上运行这个脚本没有任何问题。但是,如果我把它作为cron工作,它就不会启动firefox。
这是我在 crontab
中的条目# connect to dataone
55 17 * * * ruby /home/raguanu/Dropbox/nettie.rb >> /tmp/cron_test
我在/ tmp / cron_test中看到以下条目。所以看起来这个剧本确实跑了。
PROFILE:
i486-linux
/usr/bin/firefox -jssh
但我无法弄清楚为什么我没有看到firefox开放,因为这种自动化工作。这是 /home/raguanu/Dropbox/nettie.rb
#!/usr/bin/ruby -w
require 'rubygems'
require 'firewatir'
require 'optiflag'
module Options extend OptiFlagSet
character_flag :d do
long_form 'disconnect'
description 'Mention this flag if you want to disconnect dataone'
end
flag :l do
optional
long_form 'admin_link'
default 'http://192.168.1.1'
description 'Dlink web administration link. Defaults to http://192.168.1.1'
end
flag :u do
optional
long_form 'user'
default 'admin'
description 'Dlink administrator user name. Defaults to "admin"'
end
flag :p do
optional
long_form 'password'
default 'admin'
description 'Dlink administrator password. Defaults to "admin"'
end
flag :c do
optional
long_form 'connection_name'
default 'bsnl'
description 'Dataone connection name. Defaults to "bsnl"'
end
extended_help_flag :h do
long_form 'help'
end
and_process!
end
class DlinkAdmin
include FireWatir
def initialize(admin_link = "http://192.168.1.1", user = 'admin', pwd = 'admin')
@admin_link, @user, @pwd = admin_link, user, pwd
end
def connect( connection_name = 'bsnl' )
goto_connection_page connection_name
# disconnect prior to connection
@browser.button(:value, 'Disconnect').click
# connect
@browser.button(:value, 'Connect').click
# done!
@browser.close
end
def disconnect( connection_name = 'bsnl' )
goto_connection_page connection_name
# disconnect
@browser.button(:value, 'Disconnect').click
# done!
@browser.close
end
private
def goto_connection_page( connection_name = 'bsnl')
@browser ||= Firefox.new
@browser.goto(@admin_link)
# login
@browser.text_field(:name, 'uiViewUserName').set(@user)
@browser.text_field(:name, 'uiViewPassword').set(@pwd)
@browser.button(:value,'Log In').click
# setup > dataone
@browser.image(:alt, 'Setup').click
@browser.link(:text, connection_name).click
end
end
admin = DlinkAdmin.new(Options.flags.l, Options.flags.u, Options.flags.p)
unless Options.flags.d?
admin.connect( Options.flags.c )
else
admin.disconnect( Options.flags.c )
end
感谢任何帮助。
答案 0 :(得分:3)
您需要有一个指向有效X-server的DISPLAY环境。这可能涉及将其设置为值“:0.0”(不带引号),以便它引用您的本地标准DISPLAY。
但要注意以下几点: 您可以运行X虚拟帧缓冲区(xvfb),以便Firefox只使用它作为显示。这意味着Firefox将能够完成所有图形操作,但它将独立于您的标准图形环境。您必须适当地设置DISPLAY变量,使其指向xvfb实例。例如,如果您按如下方式调用xvfb:
Xvfb :1 -screen 0 1600x1200x32
然后,您可以通过将DISPLAY变量设置为:1
来使用它您正在启动一个完整的firefox实例,只需连接或断开您的调制解调器即可。您很可能能够使用“curl”将适当的HTTP请求发送到服务器,以便它为您执行连接或断开连接。一种简单地看待你应该重新创建的方法是安装一个Firefox插件,例如LiveHTTPHeaders,并在手动执行操作时记下最重要的HTTP请求。
卷曲甚至还有红宝石绑定: libcurl for Ruby。生成的脚本应该比当前脚本小得多。
答案 1 :(得分:1)
从cron运行的程序没有您的交互式环境。因此它们没有和DISPLAY变量,因此您无法运行任何X(图形)程序,例如Firefox浏览器。
我建议您自己在ruby中进行HTTP连接,而不是尝试自动化Firefox。
答案 2 :(得分:0)
crontab条目错误
就像
#min hour day month dow user command
55 17 * * * ur_user_is_missing ruby /home/raguanu/Dropbox/nettie.rb >> /tmp/cron_test