设备不当的ioctl

问题描述:

我试图通过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

“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