设备的 ioctl 不合适

Inappropriate ioctl for device

我正在尝试通过 PHP 应用程序执行 SSH 命令。

通过 PHP 应用程序,我输入“./SSDownload.sh”。 通过我的终端 SSH,我输入“./SSDownload.sh”。

SSDownload.sh 包含:

cd /var/www/html/dev/media/mp3/
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”,无论它是什么意思。

为什么反应不同?我该如何修复它?

"ioctl" 是一个 POSIX 操作,用于向设备 ("I/O control") 发送控制命令。 "Inappropriate ioctl" 错误意味着程序发送了一个 ioctl 到一个在某些方面不正确的设备。问题是这个 spotify 程序可能使用的 ioctls 取决于它是如何 运行.

当您从命令行 运行 spotify 程序时,它有一个 TTY。当您的 PHP 代码启动程序时,它没有 TTY。它可能出于某种原因向其标准输出发送 ioctl,期望标准输出为 tty。我的猜测是它使用 ioctl 来获取终端宽度,以便它可以显示进度条图形。

有两种方法可以解决这个问题。您可以查看此 spotify 程序的文档,看看它是否具有非交互模式或批处理模式或禁用打印进度条的安静模式。这可能会避免执行失败的 ioctl。

另一个修复方法是 PHP 为 ssh 会话请求一个 pty(伪 TTY)。我不是 PHP 编码员,但 this page appears to describe the Net_SSH2 API, and it lists a function to enable requesting a PTY 调用 exec()。

尝试

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