У меня есть простой сценарий оболочки, который:
Оба сервера настроены на SSH-вход без пароля через открытый ключ.
Запуск сценария из командной строки работает хорошо. Запуск его с сервера из команды PHP shell_exec приведет к выполнению сценария, но команды ssh и scp, похоже, не выполняются или, по крайней мере, ничего не выводят, даже если я использую флаг -v.
Вот функция PHP, которая вызывает сценарий оболочки:
function mobi_watermark($userid, $email, $epubpath)
{
$outpath = "/tmp/epub$userid/"; # the book gets marked for each user, store each epub under a unique work folder to avoid collision
shell_exec("chmod -R 777 ".$outpath); # web server creates files under user "nobody".
shell_exec("del.sh"); # deletes old files if they exist
shell_exec("rep.sh $userid $email $epubpath"); # creates the initial .epub and tmp dir
shell_exec("chmod -R 777 ".$outpath);
shell_exec("kindle.sh $outpath"); # this is the mobi conversion, where the problem is
$this->mobi_ufa_download('ufa-187.mobi',$outpath);
}
А вот сценарий оболочки с ошибочными командами: [kindle.sh]
#!/usr/local/bin/bash
# uses the same /tmp$userid path as the other scripts, but on the remote server
TMPPATH=$1
cd $TMPPATH
# create remote dir
ssh -v user@server 'mkdir -v '$TMPPATH
# copy the source epub file to remote
scp -v $TMPPATHfile-name.epub user@server:$TMPPATH
# perform the conversion and copy the .mobi result back to originating server
/usr/bin/ssh -v user@server 'cd '$TMPPATH'; /home/username/kindlegen/kindlegen ./file-name.epub; scp -v file-name.mobi user@originating-server:'$TMPPATH';rm -rf '$TMPPATH
Если я запускаю эту серию команд либо из файла сценария, либо как отдельные команды из командной строки, все работает отлично.
При запуске через скрипт php я могу видеть вывод скрипта, если я решаю повторить тестовые команды, и scp сообщит об ошибке, если я нарушу имя исходного файла, но просто ничего не происходит с командами scp или ssh, если они верны в остальном. Флаг -v не дает даже подробного вывода отладки.
Я, должно быть, упускаю что-то очевидное? Я предполагаю, что это потому, что PHP использует пользователя none, который не нравится SSH. Есть ли способ обойти это, если проблема в этом?
В shell_exec(), вероятно, дает вам некоторую информацию, которую вы игнорируете, не собирая ее. Пытаться
$info=shell_exec("kindle.sh $outpath");
echo "<pre>$output</pre>";
это то, что я сделал бы, чтобы начать отладку этой проблемы.
Редактировать:
Установка привилегий на .ssh и id_rsa на 777 вызовет у вас серьезные проблемы, так как ssh отказывается работать, если они слишком разрешительные. Установите их обратно на 700 и 600 соответственно.
Я не понимаю, почему вы ничего не видите, попробуйте
$info=shell_exec("kindle.sh 2>&1 $outpath");
echo "<pre>$output</pre>";
Что должно заставить stderr тоже выйти.
Где хранится закрытый ключ ssh, в файле ~ / .ssh / id _... пользователя, от имени которого вы запускаете команду?
Если да, то apache не работает от имени вашего пользователя. Apache должен иметь доступ к копии ключа ssh. Вы также можете добавить -i в свои команды ssh и scp, чтобы он не существовал в домашнем каталоге apache.
Вы можете попробовать добавить
</dev/null
в конце оскорбительных команд только в том случае, если каким-то образом командам нужен ввод.
Когда у меня возникают проблемы с выполнением внешних скриптов из процессов httpd и php, я пытаюсь запустить вручную под тем же пользователем, от имени которого запускается процесс httpd.
su nobody
Очень высока вероятность того, что у пользователя none не установлена оболочка, вам нужно будет включить оболочку для su
к нему.