Tob*_*lor 1 php ssh bash phpseclib
我正在尝试通过PHP应用程序执行SSH命令.
通过PHP应用程序,我输入"./SSDownload.sh".通过我的终端SSH,我输入"./SSDownload.sh".
SSDownload.sh包含:
cd /var/www/html/dev/media/mp3/$1
spotify-to-mp3 songs.txt
Run Code Online (Sandbox Code Playgroud)
通过我的终端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
Run Code Online (Sandbox Code Playgroud)
文件成功下载,并将文件放在正确的目录中.
我使用以下代码尝试使用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 />";
Run Code Online (Sandbox Code Playgroud)
输出:
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
Run Code Online (Sandbox Code Playgroud)
该文件未成功下载,并且不会将文件放在正确的目录中.
我想把你的注意力集中在" 不合适的设备上 ",无论它意味着什么.
为什么回答不同?我该怎么办呢?
"ioctl"是用于向设备发送控制命令的POSIX操作("I/O控制")."不适当的ioctl"错误意味着程序以某种方式将ioctl发送到不正确的设备.问题是这个spotify程序可能正在使用的ioctls取决于它的运行方式.
从命令行运行spotify程序时,它有一个TTY.当您的PHP代码启动该程序时,它没有TTY.由于某种原因,它可能会将ioctl发送到其标准输出,期望标准输出为tty.我的猜测是它使用ioctl来获取终端宽度,以便它可以显示进度条图形.
有两种方法可以解决这个问题.您可以查看此spotify程序的文档,以查看它是否具有非交互模式或批处理模式或禁用打印进度条的安静模式.这可能会避免执行失败的ioctl.
另一个解决方法是让PHP为ssh会话请求一个pty(伪TTY).我不是PHP编码器,但是这个页面似乎描述了Net_SSH2 API,它列出了一个函数,可以请求一个PTY来调用exec().