Php 设备的ioctl不正确

Php 设备的ioctl不正确,php,bash,ssh,phpseclib,Php,Bash,Ssh,Phpseclib,我试图通过PHP应用程序执行SSH命令 通过PHP应用程序,我键入“/SSDownload.sh”。 通过终端SSH,我键入“/SSDownload.sh” SSDownload.sh包含: cd /var/www/html/dev/media/mp3/$1 spotify-to-mp3 songs.txt Resolving "fancy iggy azalea" Searching "fancy iggy azalea" on Grooveshark "Iggy Azalea - Fanc

我试图通过PHP应用程序执行SSH命令

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

SSDownload.sh包含:

cd /var/www/html/dev/media/mp3/$1
spotify-to-mp3 songs.txt
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
通过终端SSH,我得到以下响应:

cd /var/www/html/dev/media/mp3/$1
spotify-to-mp3 songs.txt
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 />";
文件未成功下载,并且未将文件放置在正确的目录中

我想提醒您注意“设备的ioctl不合适”,不管它是什么意思

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

ioctl是一种POSIX操作,用于向设备发送控制命令(“I/O控制”)。“不适当的ioctl”错误意味着程序向设备发送的ioctl以某种方式不正确。问题是这个spotify程序可能使用的IOCTL取决于它的运行方式

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

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

另一个修复方法是让PHP为ssh会话请求一个pty(伪TTY)。我不是PHP程序员,但似乎描述了Net_SSH2 API,它用于调用exec()。

ioctl是一种POSIX操作,用于向设备发送控制命令(“I/O控制”)。“不适当的ioctl”错误意味着程序向设备发送的ioctl以某种方式不正确。问题是这个spotify程序可能使用的IOCTL取决于它的运行方式

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

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

另一个修复方法是让PHP为ssh会话请求一个pty(伪TTY)。我不是PHP程序员,但似乎描述了Net_SSH2 API,它用于调用exec()。

试试看

echo "1 : " . $ssh->exec('/bin/bash -c '.escapeshellarg('./SSDownload.sh ' . escapeshellarg($_GET['player']))) . "<br />";
echo“1:”$ssh->exec('/bin/bash-c'.escapeshellarg('./SSDownload.sh'.escapeshellarg($\u GET['player']))。“
”;
试试看

echo“1:”$ssh->exec('/bin/bash-c'.escapeshellarg('./SSDownload.sh'.escapeshellarg($\u GET['player']))。“
”;

偷窃是不好的,mkay@zerkms这是针对spotify应用程序的:3 ssh是如何涉及的?@Kenster我想知道为什么在同一台机器上执行相同的脚本会产生两种不同的结果。由于两个应用程序都使用SSH来执行脚本,因此都涉及到SSH。谢谢。PHP应用程序正在使用ssh?你能从PHP应用程序中添加相关的源代码吗?偷窃是不好的,mkay@zerkms这是针对spotify应用程序的:3 ssh是如何涉及的?@Kenster我想知道为什么在同一台机器上执行相同的脚本会产生两种不同的结果。由于两个应用程序都使用SSH来执行脚本,因此都涉及到SSH。谢谢。PHP应用程序正在使用ssh?你能从PHP应用程序中添加相关的源代码吗?我现在正在测试,答案基本上是正确的。我试图重现这个问题,但也偶然发现了
enablePTY()
。当我使用它时,该命令只输出一个
1
。。想知道为什么现在。为你感到荣幸。成功了。非常感谢,谢谢!解决方案:$ssh->enablePTY()$ssh->exec('./SSDownload.sh'.$\u GET['player']);echo$ssh->read()@托比,你需要解决的一个重要问题是:你需要使用
escapeshellarg($\u GET['player'])
。。否则可以使用
player
变量从remote@hek2mgl
当我使用它时,该命令只输出一个1
如果spotify正在检查终端宽度以格式化进度线,可能是PTY得到的默认终端宽度不是一个合理的值。在我链接到的页面上,有一些函数可以设置PTY的宽度和高度。他们可能会有帮助。我现在正在测试答案基本上是正确的。我试图重现这个问题,但也偶然发现了
enablePTY()
。当我使用它时,该命令只输出一个
1
。。想知道为什么现在。为你感到荣幸。成功了。非常感谢,谢谢!解决方案:$ssh->enablePTY()$ssh->exec('./SSDownload.sh'.$\u GET['player']);echo$ssh->read()@托比,你需要解决的一个重要问题是:你需要使用
escapeshellarg($\u GET['player'])
。。否则可以使用
player
变量从remote@hek2mgl
当我使用它时,该命令只输出一个1
如果spotify正在检查终端宽度以格式化进度线,可能是PTY得到的默认终端宽度不是一个合理的值。在我链接到的页面上,有一些函数可以设置PTY的宽度和高度。他们可能会有所帮助。