我需要运行一个cron作业,使用reposman.rb为Redmine添加一个svn存储库。但是我们还有一个PHP脚本(带有接口),使我们能够自动创建存储库。
php脚本接收$ _POST值,创建repos,设置权限,分配一些组以便对新创建的repos进行读写访问。
我的问题是:
svnadmin create
命令? 由于
修改 以下是两个脚本的一些示例。
Ruby脚本:
... // Add the repos system "svnadmin create #{path}" ...
Php脚本:
// Receive the name of the repos to add $dir= $_POST["dir"]; // Do all the stuff with the permissions $cmd= "sudo /usr/local/bin/createsvnrepo $dir"; system("$cmd", $retval); ...
答案 0 :(得分:1)
如果可以更改脚本,则应该通过文件或标准输入获取其输入数据。如果不是,您可以编写一个包装脚本,从文件/ stdin中选择数据,用它填充$_POST
(是的,PHP超级全局可写)并通过require
调用原始脚本。
答案 1 :(得分:0)
向您的脚本发送http请求 - $ _POST不打算从命令行初始化。
答案 2 :(得分:0)
您可以使用以下方法伪造对PHP脚本的POST请求:
(好吧,它实际上比“假”更“实施”)
exec "echo 'var=123_&data=...' | "
" REQUEST_METHOD=POST CONTENT_TYPE=application/x-www-form-urlencoded "
" php-cgi"
请注意,它确实需要php-cgi
二进制文件,而不是正常的-cli版本。您需要复制CGI environment变量的所有。因此,仅修改现有脚本以接受$ argv参数可能更容易。
答案 3 :(得分:0)
您可以从命令行运行脚本。 像这样:
params = {'foo' => 'bar'} #etc
param_str = params.collect {|k,v| "#{CGI.escape(k)}=#{CGI.escape(v)}"}.join('&')
popen("/usr/bin/php /path/to/script.php", "w+") do |pipe|
pipe.puts(param_str)
pipe.close_write
res = pipe.read
end
答案 4 :(得分:0)
你需要在这里使用php命令行界面(php_cli)。你没有$ _POST,但你可以提供传递给php脚本的参数。从ruby执行系统调用以执行php脚本(我dunno ruby所以我只发布了php部分)。在你的php脚本中,从正确的shabang开始:
#!/usr/bin/php
<?php
电话应该是这样的: ./myscript.php -v = value1 -b = value2
检查$ _SERVER ['argv']是否传递了值
答案 5 :(得分:0)
因为@Richard Knop的评论比任何答案都更有帮助,我会回答我自己的问题来帮助别人。
我使用curb向php脚本发送帖子。
的 reposman.rb 强> 的
... # Added at start of file. require 'rubygems' require 'curb' ... # Replace the creation of repos from module SCM module Subversion def self.create(path) system_or_raise "svnadmin create #{path}" end end ... end # to module SCM module Subversion def self.create(path) Curl::Easy.http_post( "http://example.com/customCreaterepos.php", # Url to the php script Curl::PostField.content('reposName', path)) # Index of php $_POST in script end end ... end