У меня есть следующие файлы:
1. Файл TCL, который запускает rsync с использованием exec.
2. PHP-файл, который вызывается с веб-сайта (пользовательский интерфейс) и передает аргументы в файл TCL (главным образом, пути к каталогам). Я тестировал его несколько раз с веб-сайта, и аргументы успешно передаются в файл TCL (они успешно отражаются в TCL).
Вот проблема: когда я запускаю файл TCL из командной строки (и передаю аргументы вручную), rsync работает отлично. Когда я запускаю файл TCL из PHP и передаю аргументы, я получаю сообщение об ошибке:
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [sender]
Моя интуиция говорит мне, что это вопрос разрешения — но какой? Я пытался играть с chmods и chowns, но безрезультатно.
РЕДАКТИРОВАТЬ:
Вот фрагмент кода. Короче говоря, пользователь входит в веб-портал с пользовательским интерфейсом, где javascript позволяет пользователю выбрать файл для последующего удаленного выполнения (модель подземных вод). Javascript отправляет выбранное имя файла в промежуточный скрипт PHP. Имя пользователя для входа аналогично имени каталога, в котором находятся файлы модели. Вот короткие версии кодов. PHP:
//PHP Code:
$username = <hardwired at this point>;
$selRun = $_POST["script"]; //retrieved successfully from javascript
exec("tclsh run.tcl ".$username." ".$selRun." >> files/".$username."/.status.txt 2>&1");
Файл TCL довольно длинный, но вот ключевые части. Имя пользователя совпадает с именем каталога, на который ссылается. И снова, аргументы успешно передаются в TCL из PHP:
# TCL Code:
set dirName [lindex $argv 0]
set fileName [lindex $argv 1]
set $key <some file>
set CPString [format {rsync -lptgoDvz --rsh="sshpass -f %s ssh" /<local path>/%s/*.* <user>@<someIP>:/<remote path>/%s/} $key $dirName $dirName]
catch {exec >&@stdout bash <<$CPString}
Наконец, это может быть проблема с разрешениями на удаленном компьютере?
Задача ещё не решена.
Других решений пока нет …