Назад | Перейти на главную страницу

SSH не запускается в сценарии bash, вызываемом через веб-сервер

У меня есть простой сценарий оболочки, который:

  1. Создает каталог на удаленной машине.
  2. Копирует файл .epub в новый каталог удаленного компьютера.
  3. Запускает kindlegen для преобразования .epub в .mobi.
  4. Удаленный сервер копирует новый файл .mobi обратно на исходный сервер.

Оба сервера настроены на 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 к нему.