Java唤醒本地应用的两种方法详解
目录
- 引言
- 1. Runtime使用方式
- 2. ProcessBuilder使用方式
- 3. 小结
引言
作为一个后端同学,经常被安全的小伙伴盯上,找一找安全漏洞;除了常说的注入之外,还有比较吓人的执行远程命令,唤醒本地应用程序等;然后有意思的问题就来了,写了这么多年的代码,好像还真没有尝试过用java来唤醒本地应用程序的
比如说一个最简单的,打开本地的计算器,应该怎么搞?
接下来本文将介绍一下如何使用java打开本地应用,以及打开mac系统中特殊一点的处理方式(直白来说就是不同操作系统,使用姿势不一样)
1. Runtime使用方式
主要是基于Runtime.getRuntime().exec()
来执行shell命令,来打开应用
比如打开计算器
// win系统 Runtime.getRuntime().exec("exec"); // mac系统 Runtime.getRuntime().exec("open -n /Applications/Calculator.app")
从上面的传参也可以看出两者的区别,为什么mac会整一个 open -n
, 这个其实可以理解为在终端执行命令,打开计算器
注意事项
对于mac系统而言,除了上面这种打开方式之外,还有下面这种姿势
Runtime.getRuntime().exec("/Applications/Calculator.app/Contents/MacOS/Calculator")
在exec中指定计算器的路径,有个很容易采的坑,直接写成下面这种
Runtime.getRuntime().exec("/Applications/Calculator.app")
上面这个直接执行之后会提示权限错误,其主要原因是mac系统的应用和win中的exe作为启动方式不太一样,对于mac而言,可以理解xxx.app
为一个目录,真正执行文件是内部的xxx/Contents/MacOS/xxx
2. ProcessBuilder使用方式
除了Runtime唤起之外,使用ProcessBuilder也属于非常常见的case
// win new ProcessBuilder("exec").start() // mac 注意,使用下面这个,则传参不能是 open -n xxx new ProcessBuilder("/Applications/Calculator.app/Contents/MacOS/Calculator").start()
使用上面这种姿势,特别需要注意的是内部传参不能是open -n
3. 小结
从上面介绍的方式来看,其实打开应用程序的思路主要就是利用java来执行脚本命令;内容比较简单,隐患却是比较大的;在自己的项目中,最好不要出现这种调用方式
以上就是Java唤醒本地应用的两种方法详解的详细内容,更多关于Java唤醒本地应用的资料请关注我们其它相关文章!
相关推荐
-
Java多线程阻塞与唤醒代码示例
java线程的阻塞及唤醒 1. sleep() 方法: sleep(-毫秒),指定以毫秒为单位的时间,使线程在该时间内进入线程阻塞状态,期间得不到cpu的时间片,等到时间过去了,线程重新进入可执行状态.(暂停线程,不会释放锁) //测试sleep()方法 class Thread7 implements Runnable{ @Override public void run() { for(int i=0;i<50;i++){ System.out.println(Thread.currentT
-
Java wait和notify虚假唤醒原理
自己在此记录一下,方便日后复习. 虚假唤醒的概念 jdk官方文档解释: 所以说在wait和notify一块使用时,如果使用if作为条件时,会有虚假唤醒的情况发生,所以必须使用while作为循环条件.下面来举例实验: 首先,创建一个资源类:(在多线程中,一般都是资源类和线程操作解耦,不放在用同一个类中,只有在线程操作资源类时,才会创建资源类的对象) package com.test; /** * 资源类 * @author Huxudong * @createTime 2020-04-01 21:
-
简单了解java等待唤醒机制原理及使用
这篇文章主要介绍了简单了解java等待唤醒机制原理及使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 这是一篇走心的填坑笔记,自学Java的几年总是在不断学习新的技术,一路走来发现自己踩坑无数,而填上的坑却屈指可数.突然发现,有时候真的不是几年工作经验的问题,有些东西即使工作十年,没有用心去学习过也不过是一个10年大坑罢了(真实感受). 刚开始接触多线程时,就知道有等待/唤醒这个东西,写过一个demo就再也没有看过了,至于它到底是个什么东西,
-
Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解
前言 前面的例子都是多个线程在做相同的操作,比如4个线程都对共享数据做tickets–操作.大多情况下,程序中需要不同的线程做不同的事,比如一个线程对共享变量做tickets++操作,另一个线程对共享变量做tickets–操作,这就是大名鼎鼎的生产者和消费者模式. 正文 一,生产者-消费者模式也是多线程 生产者和消费者模式也是多线程的范例.所以其编程需要遵循多线程的规矩. 首先,既然是多线程,就必然要使用同步.上回说到,synchronized关键字在修饰函数的时候,使用的是"this"
-
代码分析Java中线程的等待与唤醒
我们先来看一下实例代码: class ThreadA extends Thread{ public ThreadA(String name) { super(name); } public void run() { synchronized (this) { System.out.println(Thread.currentThread().getName()+" call notify()"); notify(); } } } public class WaitTest { publ
-
Java 实现多线程切换等待唤醒交替打印奇偶数
引言 在日常工作生活中,可能会有用时几个人或是很多人干同一件事,在java编程中,同样也会出现类似的情况,多个线程干同样一个活儿,比如火车站买票系统不能多个人买一到的是同一张票,当某个窗口(线程)在卖某一张票的时候,别的窗口(线程)不允许再卖此张票了,在此过程中涉及到一个锁和资源等待的问题,如何合理正确的让线程与线程在干同一件事的过程中,不会抢资源以及一个一直等待一个一直干活的状况,接下来就聊一下多线程的等待唤醒以及切换的过程,在此就以A和B两个线程交替打印奇偶数的例子为例,代码如下: pack
-
Java唤醒本地应用的两种方法详解
目录 引言 1. Runtime使用方式 2. ProcessBuilder使用方式 3. 小结 引言 作为一个后端同学,经常被安全的小伙伴盯上,找一找安全漏洞:除了常说的注入之外,还有比较吓人的执行远程命令,唤醒本地应用程序等:然后有意思的问题就来了,写了这么多年的代码,好像还真没有尝试过用java来唤醒本地应用程序的 比如说一个最简单的,打开本地的计算器,应该怎么搞? 接下来本文将介绍一下如何使用java打开本地应用,以及打开mac系统中特殊一点的处理方式(直白来说就是不同操作系统,使用姿势
-
Java实现Excel转PDF的两种方法详解
目录 一.使用spire转化PDF 1.使用spire将整个Excel文件转为PDF 2.指定单个的sheet页转为PDF 二.使用jacob实现Excel转PDF(推荐使用) 1.环境准备 2.执行导出PDF 使用具将Excel转为PDF的方法有很多,在这里我给大家介绍两种常用的方法,分别应对两种不一样的使用场景,接下来我在springboot环境下给大家做一下演示! 一.使用spire转化PDF 首先介绍一种比较简单的方法,这种方法可以使用短短的几行代码就可以将我们的Excel文件中的某一个
-
使用Java构造和解析Json数据的两种方法(详解二)
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包. 在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面接着介绍用org.json构造和解析Json数据的方法
-
使用Java构造和解析Json数据的两种方法(详解一)
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON数据不须要任何特殊的 API 或工具包. 在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Json数据的方法
-
基于ScheduledExecutorService的两种方法(详解)
开发中,往往遇到另起线程执行其他代码的情况,用java定时任务接口ScheduledExecutorService来实现. ScheduledExecutorService是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响. 注意,只有当调度任务来的时候,ScheduledExecutorService才会真正启动一个线程,其余时间ScheduledExecutorService都是处于轮询任务的状态. 1.scheduleAtFix
-
Java数据结构之图的两种搜索算法详解
目录 前言 深度优先搜索算法 API设计 代码实现 广度优先搜素算法 API设计 代码实现 案例应用 前言 在很多情况下,我们需要遍历图,得到图的一些性质,例如,找出图中与指定的顶点相连的所有顶点,或者判定某个顶点与指定顶点是否相通,是非常常见的需求. 有关图的搜索,最经典的算法有深度优先搜索和广度优先搜索,接下来我们分别讲解这两种搜索算法. 学习本文前请先阅读这篇文章 [数据结构与算法]图的基础概念和数据模型. 深度优先搜索算法 所谓的深度优先搜索,指的是在搜索时,如果遇到一个结点既有子结点,
-
Golang打印复杂结构体两种方法详解
目录 fmt结构体占位符 打印复杂结构体 方案一 方案二 fmt结构体占位符 在Golang中有原生的 fmt 格式化工具去打印结构体,可以通过占位符%v.%+v.%#v去实现,这3种的区别如下所示: type User struct { Name string Age int } func main() { user := User{ Name: "张三", Age: 95, } fmt.Printf("%v\n", user) fmt.Printf("
-
对python捕获ctrl+c手工中断程序的两种方法详解
日常编写调试运行程序过程中,难免需要手动停止,以下两种方法可以捕获ctrl+c立即停止程序 1.使用python的异常KeyboardInterrupt try: while 1: pass except KeyboardInterrupt: pass 2.使用signal模块 def exit(signum, frame): print('You choose to stop me.') exit() signal.signal(signal.SIGINT, exit) signal.sign
-
Python获取网络时间戳的两种方法详解
目录 方法一 代码实现 调用方法 返回结果 方法二 代码实现 调用方法 返回结果 在我们进行注册码的有效期验证时,通常使用获取网络时间的方式来进行比对. 以下为获取网络时间的几种方式. 方法一 需要的时间会比较长,个别电脑上可能会出现不兼容现象 代码实现 def get_web_server_time(self, host_URL, year_str='-', time_str=':'): ''' 获取网络时间,需要的时间会比较长,个别电脑上可能会出现不兼容现象 :param host_URL:
-
SpringBoot处理接口幂等性的两种方法详解
目录 1. 接口幂等性实现方案梳理 1.1 基于 Token 1.2 基于请求参数校验 2. 基于请求参数的校验 在上周发布的 TienChin 项目视频中,我和大家一共梳理了六种幂等性解决方案,接口幂等性处理算是一个非常常见的需求了,我们在很多项目中其实都会遇到.今天我们来看看两种比较简单的实现思路. 1. 接口幂等性实现方案梳理 其实接口幂等性的实现方案还是蛮多的,我这里和小伙伴们分享两种比较常见的方案. 1.1 基于 Token 基于 Token 这种方案的实现思路很简单,整个流程分两步:
随机推荐
- 黑客如何给你的系统种木马
- Java的几个重要版本_动力节点Java学院整理
- 使用spring实现邮件的发送实例(含测试,源码,注释)
- ASP.NET返回上一页面的实现代码
- Android指纹识别API初试
- 让JavaScript拥有类似Lambda表达式编程能力的方法
- Bootstrap 表单验证formValidation 实现远程验证功能
- 使用ASP.NET中关于代码分离的实例分享
- Python ORM框架SQLAlchemy学习笔记之数据查询实例
- node安装--linux下的快速安装教程
- 遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
- jquery radio的取值_radio的选中_radio的重置方法
- 微信小程序中页面FOR循环和嵌套循环
- Android开发中模仿qq列表信息滑动删除功能
- android之datepicker控件的用法
- java必学必会之equals方法
- C#中如何获取文件图标
- php输出全球各个时区列表的方法
- 让鼠标玩CS更顺手的设置技巧
- 基于vue-video-player自定义播放器的方法