我试图通过PHP应用程序执行SSH命令。</ p>
通过PHP应用程序,我输入&#34; ./ SSDownload.sh&#34;。 通过我的终端SSH,我输入&#34; ./ SSDownload.sh&#34;。
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
文件未成功下载,并且未将文件放在正确的目录中。
我想把你的注意力集中在&#34; 不合适的ioctl for device &#34;,无论它意味着什么。
为什么回答有所不同?我该怎么办呢?
答案 0 :(得分:5)
&#34; ioctl&#34;是一个POSIX操作,用于向设备发送控制命令(&#34; I / O控制&#34;)。 &#34;不恰当的ioctl&#34;错误意味着程序将ioctl发送到以某种方式不正确的设备。问题是这个spotify程序可能正在使用哪些依赖于它的运行方式。
从命令行运行spotify程序时,它有一个TTY。当您的PHP代码启动程序时,它没有TTY。由于某些原因,它可能会将ioctl发送到其标准输出,期望标准输出为tty。我的猜测是它使用ioctl获取终端宽度,以便它可以显示进度条图形。
有两种方法可以解决这个问题。您可以查看此spotify程序的文档,以查看它是否具有非交互模式或批处理模式或禁用打印进度条的安静模式。这可能会避免执行失败的ioctl。
另一个解决方法是让PHP为ssh会话请求pty(伪TTY)。我不是PHP编码器,但this page似乎描述了Net_SSH2 API,而lists a function to enable requesting a PTY用于调用exec()。
答案 1 :(得分:0)
尝试
echo "1 : " . $ssh->exec('/bin/bash -c '.escapeshellarg('./SSDownload.sh ' . escapeshellarg($_GET['player']))) . "<br />";