我有一个用Java开发的简单程序来运行笔记本电脑的网络摄像头,运行这个我运行一个批处理文件。我想知道是否有可能从我创建的网站运行这个批处理文件,而不是必须在机器上并单击批处理文件。任何帮助或指导,我将不胜感激,因为我不太确定如何做到这一点关于网站和机器之间所需的语言或通信。现在我知道它存在安全风险,你可能会问为什么,但它只是为了一个大学项目,所以它只会在我自己的机器上运行,也在我的机器上运行apache网站,以及它更多只是为了表明它可以做到。
答案 0 :(得分:1)
对于正版服务器端批处理工作,您需要服务器端脚本,它将接受来自客户端的指令,然后编写并执行操作系统命令。
我只需要这样做一次,服务器端环境包含* NIX下的PHP。对于严重差的UNIX和PHP文档进行了大量研究,以得出下面概述的模式,这有点粗略,你需要将它从几个部分拼凑回来。我无法发布整个事情,因为(a)它太大而且在大约20个单独的文件中,并且(b)它是为付费客户开发的,其中很多都是专有的。以下是一套高度消毒的提取物。
应用程序批处理方面的核心是以下用于通用admin.php脚本中的大型交换机/案例结构的案例。此脚本充当客户端请求和许多批处理(和非批处理)脚本之间的接口(也使用PHP编写,但可能使用包括Java在内的任何其他语言):
case 'batch_command':
$dx = isset($_REQUEST['dx']) ? $_REQUEST['dx'] : -1;
$dy = isset($_REQUEST['dy']) ? $_REQUEST['dy'] : '';
$dz = isset($_REQUEST['dz']);
$opts = array();
$opts[] = '--b';
if($dx != -1) { $opts[] = '--dx ' . $dx; }
if($dy != '') { $opts[] = '--dy ' . urlencode($dy); }
if($dz) { $opts[] = '--dz'; }
$command = sprintf(PHP_COMMAND, PHP_SCRIPT, implode(' ',$opts));
$priority = 19;
$pid = run_in_background($command, $priority);//kick off background process to calculate items.
exit("Calculating items for account $dx in background task.<br/>$command<br/>Check the log for progress.");//feedback message to be displayed by the client.
break;
需要以下PHP定义的常量:
define('PHP_SCRIPT', '/var/www/xxxxx.php');//path to a script on the server
define('LOG_FILE', '/var/www/yyyyy.log');//iirc, this is created automatically if it doesn't already exist.
define('PHP_COMMAND', "php %s %s >> ".LOG_FILE." 2>&1");//trust me, this took an age to derive.
这是run_in_background
函数:
function run_in_background($Command, $Priority = 0){
if($Priority){
$PID = shell_exec("nohup nice -n $Priority $Command & echo $!");
}
else{
$PID = shell_exec("nohup $Command & echo $!");
}
return($PID);
}
nohup
(“nohangup”)是批处理工作的关键 - 它是一个UNIX命令,允许PHP的shell_exec
立即返回PID,并在后台继续执行命令脚本,按照自己的节奏,将其输出提供给日志文件。
要在PHP批处理脚本中选择命令行选项,您需要知道如何为getopt() command撰写名为options
和longopts
的内容。为简洁起见,我不会提供一个示例(清理我的一个批处理脚本需要做很多工作)。
有时需要在启动相同类型的另一个进程之前查明进程是否正在运行,以确保两个类似的进程不竞争。为此,您需要存储(通常在数据库中)shell_exec("nohup ...")
(或其他命令)返回的PID,因此您可以在下一轮测试。测试如下:
function is_process_running($PID){
exec("ps $PID", $ProcessState);
return(count($ProcessState) >= 2);
}
这不是上面所做的,而是在我的怪物应用程序的其他地方使用。
答案 1 :(得分:0)
这主要取决于您使用的浏览器以及与该浏览器关联的安全设置。操作系统级别的安全设置也很重要。
无论如何,您不能“从网站运行批处理文件”。您要遵循的流程如下:
最终执行批处理文件的不是您的“网站”,正如您所说的那样;它是在浏览器下运行的JavaScript代码。换句话说,您的服务器端无法主动强制在客户端运行批处理文件。
答案 2 :(得分:0)
Java applet在java沙箱模型中运行。看看这些链接: http://docstore.mik.ua/orelly/java-ent/security/ch01_02.htm http://docs.oracle.com/javase/tutorial/deployment/applet/security.html
您可以编写小程序,对其进行签名并向网站用户请求权限,以允许使用外部资源。
但是,由于您希望能够访问网络摄像头,我会首先尝试查找一些闪存代码,因为通过使用Flash脚本而不是小程序访问本地计算机的网络摄像头更为常见。 / p>
看看这个jquery插件,您可能会发现它非常有用:http://www.xarg.org/project/jquery-webcam-plugin/
答案 3 :(得分:0)
如果你的机器实际上是网络服务器,你应该没有问题从服务器端代码执行批处理(你使用服务器端的语言是什么?)
使用javascript或下载它是另一个我不会解决的故事,因为它不是一个很好的方法,因为:
由于几个原因,通常会阻止和/或无法从服务器端代码运行某些内容。
这些都是无效的,因为你说你是服务器并想要这样做(所以发疯)
您可以使用System.Diagnostics.Process对象启动外部流程。
Runtime.getRuntime().exec("cmd /c start go.bat");
等。等