ubuntu docker 8g
1docker pull apachekylin/apache-kylin-standalone:4.0.0
2
3docker run -d \
4-m 8G \
5-p 7070:7070 \
6-p 8088:8088 \
7-p 50070:50070 \
8-p 8032:8032 \
9-p 8042:8042 \
10-p 2181:2181 \
11-p 5005:5005 \
12apachekylin/apache-kylin-standalone:4.0.0
5005是远程调试端口
Kylin 页面:http://127.0.0.1:7070/kylin/login admin KYLIN HDFS NameNode 页面:http://127.0.0.1:50070 YARN ResourceManager 页面:http://127.0.0.1:8088
具体看官方的docker安装文档 https://kylin.apache.org/cn/docs/install/kylin_docker.html
远程调试配置,修改 /home/admin/apache-kylin-4.0.0-bin-spark2/bin/kylin.sh
在retrieveStartCommand函数修改
1$JAVA ${KYLIN_EXTRA_START_OPTS} ${KYLIN_TOMCAT_OPTS} -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005 -classpath ${KYLIN_TOMCAT_CLASSPATH} org.apache.catalina.startup.Bootstrap start >> ${KYLIN_HOME}/logs/kylin.out 2>&1 & echo $! > ${KYLIN_HOME}/pid &
在 org.apache.kylin.rest.controller.DiagnosisController#dumpProjectDiagnosisInfo
中
跟进dumpProjectDiagnosisInfo
这里getProject()通过ValidateUtil.convertStringToBeAlphanumericUnderscore(project)
处理,但是runDiagnosisCLI(args)
中接受的cmd参数仍然是通过project传过来的,相当于命令行可控。
而且getProject(ValidateUtil.convertStringToBeAlphanumericUnderscore(project))
将传入的命令进行如下处理。将除数字字母下划线以外的东西替换为空。比如传入命令为 touch 123
,将被替换为touch123
1 public static String convertStringToBeAlphanumericUnderscore(String toBeConverted) {
2 return toBeConverted.replaceAll("[^a-zA-Z0-9_]", "");
3 }
刚好解决projectInstance==null
抛出异常的问题。
1 if (null == projectInstance) {
2 throw new BadRequestException(
3 String.format(Locale.ROOT, msg.getDIAG_PROJECT_NOT_FOUND(), project));
4 }
最后执行的命令如下
再来看创建项目的地方
org.apache.kylin.rest.controller.ProjectController#saveProject
项目名进行ValidateUtil.isAlphanumericUnderscore()
校验,不能有数字字母下划线以外的东西。
完整的利用方式如下,以执行命令touch 123
为例
先创建项目,项目名为touch123
接下来触发命令执行
执行成功
传入cmd的参数改为projectName而非http传入的project,projectName经过了convertStringToBeAlphanumericUnderscore() 处理,所以无法输入非字母数字下划线的字符来触发命令执行。
巧妙利用两个函数对于参数处理的特性来进行命令执行,值得一学。
文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。