2015-04-03 1 views
1

Я пытаюсь выполнить команды SSH через приложение PHP.Недопустимый 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

+0

@zerkms Это приложение для определения пятна: 3 –

+1

Как здесь участвует ssh? – Kenster

ответ

4

«ioctl» - это операция POSIX для отправки управляющей команды устройству («управление вводом/выводом»). Ошибка «Несоответствующая ioctl» означает, что программа отправила ioctl на устройство, которое было некорректным. Вопрос в том, что iocts эта программа определения может использоваться, которая зависит от того, как она выполняется.

Когда вы запускаете программу spotify из командной строки, у нее есть TTY. Когда ваш PHP-код запускает программу, у нее нет TTY. Вероятно, по какой-то причине он отправляет ioctl на свой стандартный вывод, ожидая, что стандартный вывод будет tty. Я предполагаю, что он использует ioctl для получения ширины терминала, чтобы он мог отображать график выполнения.

Есть два способа исправить это. Вы можете проверить документацию для этой программы spotify, чтобы узнать, имеет ли он неинтерактивный режим или пакетный режим или тихий режим, который отключает печать индикатора выполнения. Это может привести к сбою в работе ioctl.

Другое исправление заключается в том, чтобы PHP запрашивал pty (псевдо-TTY) для сеанса ssh. Я не PHP-кодер, но this page, как представляется, описывает API Net_SSH2, а он lists a function to enable requesting a PTY для вызовов exec().

+0

Я тестирую его сейчас –

+0

Ответ в основном правильный. Я попытался воспроизвести проблему, а также наткнулся на 'enablePTY()'. Когда я его использую, команда просто выводит '1' .. Удивительно, почему в данный момент. – hek2mgl

+1

Престижность к вам. Это сработало. Очень ценю это, спасибо! Решение: $ ssh-> enablePTY(); $ ssh-> exec ('./ SSDownload.sh'. $ _GET ['player']); echo $ ssh-> read(); –

 Смежные вопросы

  • Нет связанных вопросов^_^