2015-04-03 55 views
1

我試圖通過PHP應用程序執行SSH命令。設備不當的ioctl

通過PHP應用程序,我輸入「./SSDownload.sh」。 通過我的終端SSH,我輸入「./SSDownload.sh」。

SSDownload.sh包含:

cd /var/www/html/dev/media/mp3/$1 
spotify-to-mp3 songs.txt 

通過我的終端SSH,我得到這樣的迴應:

Resolving "fancy iggy azalea" 
Searching "fancy iggy azalea" on Grooveshark 
"Iggy Azalea - Fancy (feat. Charli XCX)" will be downloaded 

Downloading tracks... 
[1/1] Iggy Azalea - Fancy (feat. Charli 100% [==================================] Time: 00:00:01 
Download complete 

文件下載成功,並將其放在正確的目錄中的文件。

我用下面的代碼嘗試同樣的用PHP:

include('Net/SSH2.php'); 
$ssh = new Net_SSH2('iphere'); 
if (!$ssh->login('root', 'password')) { 
exit('Login Failed'); 
} 

echo "1 : " . $ssh->exec('./SSDownload.sh ' . $_GET['player']) . "<br />"; 

輸出:

Resolving "fancy iggy azalea" Searching "fancy iggy azalea" on Grooveshark "Iggy Azalea - Fancy (feat. Charli XCX)" will be downloaded Downloading tracks... [0;31;49mInappropriate ioctl for device[0m [0;32;49mDownload complete[0m 

該文件沒有下載成功,並沒有放置在正確的目錄中的文件。

我想提醒您注意「不適當的ioctl設備」,無論如何。

爲什麼回答不同?我怎樣才能解決它?

+0

偷得不好,mkay – zerkms 2015-04-03 11:08:15

+0

@zerkms這是一個spotify應用程序:3 – 2015-04-03 11:09:43

+1

ssh是如何涉及到這裏的? – Kenster 2015-04-03 11:17:19

回答

4

「ioctl」是向設備發送控制命令(「I/O控制」)的POSIX操作。 「不適當的ioctl」錯誤意味着程序發送了一個ioctl到一個不正確的設備。問題是這個Spotify程序可能使用的ioctls取決於它的運行方式。

從命令行運行spotify程序時,它具有TTY。當你的PHP代碼啓動程序時,它沒有TTY。由於某種原因,它可能會將一個ioctl發送到其標準輸出,期望標準輸出爲tty。我的猜測是它使用ioctl來獲取終端寬度,以便它可以顯示進度條圖形。

有兩種方法可以解決這個問題。您可以查看此Spotify程序的文檔以查看它是否具有禁用打印進度欄的非交互模式或批處理模式或安靜模式。這可能會避免執行失敗的ioctl。

另一個修正是讓PHP請求一個pty(僞TTY)ssh會話。我不是一個PHP編碼器,但this page似乎描述Net_SSH2 API,而它的lists a function to enable requesting a PTY用於調用exec()。

+0

我現在正在測試它 – 2015-04-03 12:36:14

+0

答案基本上是正確的。我試圖重現這個問題,也偶然發現了'enablePTY()'。當我使用它時,命令只是輸出一個'1' ..想知道爲什麼目前。 – hek2mgl 2015-04-03 12:41:11

+1

榮譽給你。有效。非常感謝,謝謝! 解決方案: $ ssh-> enablePTY(); $ ssh-> exec('./ SSDownload.sh'。$ _GET ['player']); echo $ ssh-> read(); – 2015-04-03 12:50:21

相關問題