Ruby:cgi+;ssh不';我们不能一起工作
无法强制“cgi”和“ssh”模块一起工作。例如,这段代码Ruby:cgi+;ssh不';我们不能一起工作,ruby,ssh,cgi,Ruby,Ssh,Cgi,无法强制“cgi”和“ssh”模块一起工作。例如,这段代码 #!/usr/bin/ruby1.9 require 'cgi' require 'net/ssh' cgi = CGI.new cgi.out("status" => "302", "Connection" => "close", "Content-Length" => 1, "Location" => 'http://google.com') {' '} 2.times { |t| %x[ echo
#!/usr/bin/ruby1.9
require 'cgi'
require 'net/ssh'
cgi = CGI.new
cgi.out("status" => "302", "Connection" => "close", "Content-Length" => 1, "Location" => 'http://google.com') {' '}
2.times { |t| %x[ echo 'do something #{t}' >> /tmp/log.log ] }
%x[ echo 'before ssh' >> /tmp/log.log ]
Net::SSH.start('somehost.domain', 'someuser', :keys => [ "/tmp/id_rsa" ]) do |ssh|
ssh.exec("echo 'doing some job on remote host'; sleep 5")
end
%x[ echo 'after ssh' >> /tmp/log.log ]
在web服务器下运行时,向/tmp/log生成以下输出(请注意,ssh会话开始后没有输出):
当我从shell运行时,它完全按照我的预期执行:
do something 0
do something 1
before ssh
after ssh
这是一个bug还是我做错了什么?为什么要使用CGI?为什么不使用更现代的工具,比如,至少,或者直接与之交谈呢?另外,与其依赖重复打开子shell来重定向echo命令的输出,为什么不使用Ruby的内置记录器,或者使用
file打开日志文件。使用a
模式打开,以便附加到它?实际上,您的代码效率很低,并且与流程背道而驰。最后,当您从shell运行代码时,您的代码会像您一样运行。它以web服务器所有者的身份运行,当它作为CGI运行时,web服务器所有者的权限应该降低。这可能会妨碍使用SSH或它所需的资源。我之所以选择cgi,是因为脚本应该非常简单(几乎和我的例子一样),并且使用框架或框架,因为它太过简单了。但它似乎没有选择。2.通过shell进行日志记录就是一个例子。当然,我用的是记录器。3.特权并非如此-我从运行web服务器的同一用户运行脚本。
do something 0
do something 1
before ssh
after ssh