2012-11-29 22 views
1

想象一下,我的服務器上有一個名爲script.sh的文件。您運行該腳本,它說:是否可以使用php exec並回答腳本中的問題?

what is your name? 

那麼你輸入你的名字和它打印:

hello name! 

是否有可能,使用PHP的exec,運行這樣一個腳本?那是爲了執行腳本並以某種方式回答它可能存在的不同問題?

希望我清楚。我真正想要做的是自動從我們的開發服務器「git pull」命令,但它不斷要求輸入用戶名/密碼。我知道我可以使用SSH證書登錄來避免,但我的問題依然存在。我可以使用exec()並從腳本中回答未來的問題。

+0

大多數posix命令提供開關或選項,以便不需要交互。您可以使用PHP來收集信息並通過exec()與escapeshellargs()運行它() –

+0

我不認爲git pull是一個posix命令:( – Iznogood

+0

感謝meagar編輯 – Iznogood

回答

2

值得注意的是,您的情況更好的解決方案是使用SSH密鑰進行身份驗證。但是,你可以用PHP Expect來解決這個問題。

ini_set("expect.timeout", -1); 
ini_set("expect.loguser", "Off"); 

$stream = expect_popen("git pull"); 

while (true) { 
    switch (expect_expectl ($stream, array (
      array ("username:", USERNAME), 
      array ("password:", PASSWORD), 
    ))) { 
     case USERNAME: 
      fwrite ($stream, "usename\n"); 
      break; 
     case PASSWORD: 
      fwrite ($stream, "secret\n"); 
      break; 

     case EXP_TIMEOUT: 
     case EXP_EOF: 
      break 2; 

     default: 
      die ("Error has occurred!\n"); 
    } 
} 

fclose ($stream); 
+1

哇,沒有想法已經被放入PHP。對於不期望的信息+1。 –

+0

今天學到了一些新東西:)但我認爲他所要求的是一個腳本,它將等待鍵盤輸入不是從文件流輸入 –

+0

這幾乎是我所要求的。似乎我的版本的Ubuntu服務器沒有expect_popen tho ..在調查。 – Iznogood

0

對於你的問題:有一兩件事你可以做,如果你exctly知道什麼被要求用一個管 EXEC(「回聲‘世界你好’| some_command」) 如果你需要更復雜的交互外觀在popen()。 popen讓你可以訪問這個進程,所以你可以使用fread/fwrite等 但是這些對你的情況不起作用,因爲大多數ssh實現都使用特殊的API來檢查交互式輸入。你可以在那裏做的是使用鍵或查看ssh-agent。

相關問題