Как отобразить на локальном ПК с сервера с помощью PHP
Я работаю над проектом, который позволит пользователю запускать инструменты с веб-страницы. страница разработана с использованием php. У меня на компьютере установлен WAMP-сервер, и я могу нажать кнопку, чтобы создать и записать новый командный файл на диске C с указанием пути запуска приложений, которые извлекаются из базы данных, когда пользователь выбирает их на странице. Теперь это работает, когда я делаю это на сервере WAMP на моем ПК. Я должен загрузить скрипт на сервер на моей работе, который находится в той же локальной сети. Единственная проблема в том, что я не могу создать файл или записать его на компьютер пользователя.
Насколько я понимаю, это не отображение диска для текущего ПК. Вот как я это сделал, когда это было на моем компьютере.
$file_path="C\\test.bat"
function runApp($file_path, $appPath){
$bat_file = fopen($file_path, "w");
fwrite($bat_file, "start ".$appPath." \n");
fwrite($bat_file, "echo exit \n");
fclose($bat_file); //close file after updating batch file
}
чтобы заставить его работать с сервера на работе, я попробовал
$ip=$_SERVER['REMOTE_ADDR'];
$file_path="user:pass@".$ip."\\F:\\test.bat";
но это все еще не работает. Что мне не хватает? Любая помощь будет принята с благодарностью
или, пожалуйста, дайте мне знать, если есть какой-либо другой способ, которым я мог бы запустить командный файл или любой файл с сайта php
1 ответ
Я предполагаю, что вы знаете, что на самом деле вы не можете выполнить командный файл на клиентском ПК из сценария PHP на сервере (по крайней мере, не только с помощью PHP), поэтому я не буду объяснять это.
Я также предполагаю, что вы имеете дело со всеми машинами Windows - как кажется из примеров кода и контекста вопроса.
Здесь вы ищете функции для работы с протоколом SMB. Есть несколько способов справиться с этим:
В большинстве случаев вы можете просто использовать UNC (как вы пытаетесь сделать выше). Правильный синтаксис для этого будет
\\servername\sharename\file.ext
, Я сталкивался с людьми, утверждающими, что вы можете префикс это сusername:password@
(и одно утверждение, что вы можете суффикс@username:password
что, безусловно, должно быть не так), но я не могу заставить либо работать. Поэтому, если вы хотите использовать этот метод для выполнения этой работы, я бы порекомендовал вам запускать PHP как пользователь, у которого есть разрешения в AD для чтения / записи соответствующего общего ресурса на клиентском компьютере, поэтому дополнительная аутентификация не потребуется.Есть этот класс, который я собирался попробовать в течение некоторого времени, который обеспечивает
smb://
потоковая обертка для PHP. У меня нет никакого опыта с этим, но, судя по всему, вы сможете использовать стандартный синтаксис URL для доступа к файлу (т.е.smb://user:pass@/servername/sharename/file.ext
).Вы можете сопоставить сетевой диск так, чтобы он был доступен для использования как любая другая буква диска. Это единственный метод, который я когда-либо успешно использовал для доступа к общему ресурсу SMB, который требует аутентификации из PHP. У этого метода есть свои недостатки, так как он добавляет еще один уровень сложности - поскольку вы временно отображаете букву диска, вы гарантируете, что несколько одновременных экземпляров используют разные буквы диска.
Основная процедура будет выглядеть примерно так:
// Set the parameters
$serverNameOrIp = $_SERVER['REMOTE_ADDR'];
$shareName = 'f';
$fileName = 'test.bat';
$userName = 'Dave';
$password = 'Random';
$driveLetter = 'Z'; // You have to make sure there are no clashes with this!
// Map the drive
exec("net use {$driveLetter}: \\\\{$serverNameOrIp}\\{$shareName} {$password} /user:{$userName} /persistent:no");
// Do your thang... for example
file_put_contents("{$driveLetter}:\\$fileName",$batchFileData);
// Un-map the drive to avoid conflicts with later instances
exec("net use {$driveLetter}: \\\\{$serverNameOrIp}\\{$shareName} /delete");