2014-02-21 55 views
2

我的問題: 我在服務器A上有一個bash腳本,而在另一個服務器上有一個php腳本,服務器B上。服務器A上的shell腳本用於運行php腳本其他服務器,但前幾天有人將錯誤的rm -rf命令放在錯誤的目錄中並將其刪除。我有這個shell腳本的舊備份,但在第二個服務器上調用php腳本的代碼缺失。這幾條線(事實上,如果我記得很清楚的話)是幾年前由另一個人寫的,他們不再和我們一起工作,我也無法聯繫到她。我不是一個PHP人,並且對這種語言來說是相當新的,在過去兩天在網絡上搜索了一些提示後,我決定在這裏發帖。使用curl執行php文件

我登錄在服務器A上,作爲可以運行shell腳本的用戶。 我有另外幾個用來登錄服務器B的用戶名/密碼。這個用戶可以運行php腳本。下面是這個PHP腳本:

<?php 

/* 
php -f invoke_manage_auto_requests_files.php "create|delete|upload" "vide|pre|res|obs" "nrcc|cgcm|arpege|crcm|rc|sta|md|mds" id "processing|nom du fichier" 
eg . php -f invoke_manage_auto_requests_files.php create pre nrcc 15678 processing 
*/ 

if($argv[1] == "upload") { 
    $argv[5] = '@' . realpath($argv[5]); 
} 

$post_fields = array('ACTION' => $argv[1] , 'PREFIX' => $argv[2] , 'REQ_TYPE' => $argv[3] , 'ID' => $argv[4] , 'FILE_CONTENT' => "$argv[5]"); 
$post_fields['VALIDATE'] = md5("This is legit"); 
$url = "http://serverB/scripts/manage_auto_requests_files.php"; 
$ch = curl_init($url); 
curl_setopt($ch,CURLOPT_POST,1); 
curl_setopt($ch,CURLOPT_POSTFIELDS, $post_fields); 
curl_exec($ch); 
curl_close($ch); 
?> 

我正在尋找打電話的方式: php -f invoke_manage_auto_requests_files.php create pre nrcc 15678 processing(例如) 但是從bash腳本。我只知道這似乎是一個捲曲的電話,但我不確定。

這裏是我的服務器的規格:

服務器A:PHP Version 4.4.4-8+etch6 系統的Linux 2.6.26 HAWA-bpo.2-686-bigmem#1 SMP週五7月3日21時38分05秒UTC 2009年的i686

服務器B:PHP Version 4.3.9 系統的Linux verglas 2.6.9-34.ELsmp#1 SMP週五2月24日16時54分53秒美國東部時間2006年i686的

感謝您的閱讀,或幫助。

回答

1

Hummm。這裏不需要捲曲。使用註釋使我認爲php腳本應該從CLI執行,而不是從http web服務器執行。

首先,確保您可以從服務器A以無密碼登錄到服務器B.

如果不是這種情況下,使用ssh-copy-id用戶的公鑰從serverA的複製到ServerB

然後,只需使用從服務器A的ssh到服務器B運行腳本:

# Usage : call_server_b id 
# @param string action "create|delete|upload" 
# @param string status "vide|pre|res|obs" 
# @param string param3 "nrcc|cgcm|arpege|crcm|rc|sta|md|mds" 
# @param integer id 
# @param integer resource "processing|nom du fichier" 
call_server_b() { 
    local usage="Usage: $0 action status param3 id resource" 
    if [ $# -ne 5 ] 
    then 
     echo $usage 
    fi 
    local action=$1;shift 
    local status=$1;shift 
    local param3=$1;shift 
    local id=$1;shift 
    local resource=$1 

    case $action in 
     create|delete|upload) 
      # all good 
      ;; 
     *) 
      echo "wrong action parameter : " $action >&2 
      exit 1 
      ;; 
    esac 
    case $status in 
     vide|pre|res|obs) 
      # all good 
      ;; 
     *) 
      echo "wrong status parameter : " $status >&2 
      exit 1 
      ;; 
    esac 

    case $param3 in 
     nrcc|cgcm|arpege|crcm|rc|sta|md|mds) 
      # all good 
      ;; 
     *) 
      echo "wrong param3 parameter : " $param3 >&1 
      exit 1 
      ;; 
    esac 

    case $resource in 
     processing|'nom du fichier') 
      # all good 
      ;; 
     *) 
      echo "wrong resource parameter : " $resource >&1 
      exit 1 
      ;; 
    esac 


    ssh [email protected] \ 
     php -f /absolute/path/to/invoke_manage_auto_requests_files.php \ 
     $action $status $param3 $id $resource 
} 

call_server_b create pre nrcc 15678 processing 
+0

我同意CLI評論,但爲什麼使用bash?我認爲對於一個PHP開發人員來說,PHP不是一個障礙,而不是bash。 –

+0

,因爲php可能沒有安裝在serverA上?無論如何,bash是一個需求,看到這個問題。另外,運行外部程序如ssh時,bash是合適的。 – greg0ire

+0

爲什麼使用bash:bash腳本是由cronjob運行並執行大量任務。 .sh文件有3500多行,功能強大(即使鏈接丟失),主管不需要/不需要更新它。我忘了提及服務器A是由一家政府機構擁有的私人公司,服務器B.這就是爲什麼我不允許使用ssh-keygen/ssh-copy-id連接它們......我會聯繫寫這個鏈接的人,當我拿到它的時候我會把答案放在這裏。謝謝。 – kevindelorme