Как отобразить на локальном ПК с сервера с помощью 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");
Другие вопросы по тегам