如何使用JSch exec

时间:2015-06-24 20:45:39

标签: unix ksh jsch

条件:

  1. 我无法使用任何XML解析器工具,因为我没有权限,只读

  2. 我的xmllint版本不支持xpath,我无法更新,只读

  3. 我没有xmlstarlet,无法安装

  4. 我使用Java JSch exec频道运行我的脚本(我必须在这里运行)

  5. 所以我们在一个目录中有3个文件。

    1. sample.xml
    2. values1.properties
    3. values2.properties
    4. 文件内容如下:

      sample.xml中

      <block>
       <name>Bob</name>
       <address>USA</address>
       <email>$BOB_EMAIL</email>
       <phone>1234567</phone>
      </block>
      
      <block>
       <name>Peter</name>
       <address>France</address>
       <cell>123123123</cell>
       <drinks>Coke</drinks>
       <car>$PETER_CAR</car>
       <bike>Mountain bike</bike>
      </block>
      
      <block>
       <name>George</name>
       <hobby>$GEORGE_HOBBY</hobby>
       <phone>$GEORGE_PHONE</phone>
      </block>
      

      values1.properties

      JOE_EMAIL=joe@google.com
      BOB_EMAIL=bob@hotshot.com
      JACK_EMAIL=jack@jill.com
      MARY_EMAIL=mary@rose.com
      PETER_EMAIL=qwert1@abc.com
      GEORGE_PHONE=Samsung
      

      values2.properties

      JOE_CAR=Honda
      DAISY_CAR=Toyota
      PETER_CAR=Mazda
      TOM_CAR=Audi
      BOB_CAR=Ferrari
      GEORGE_HOBBY=Tennis
      

      我使用此脚本将xml块转换为属性文件格式

      NAME="Bob"
      sed -n '/name>'${NAME}'/,/<\/block>/s/.*<\(.*\)>\(.*\)<.*/\1=\2/p' sample.xml
      

      输出:

      name=Bob
      address=USA
      email=$BOB_EMAIL
      phone=1234567
      

      如何在$BOB_EMAILvalues1.properties中获取values2.properties的值。假设我不知道两个(或可能更多)属性文件之间的位置。如果我输入

      ,它应该以不同的方式工作
      Name=Peter
      
      在脚本中,它应该得到

      name=Peter
      address=France
      cell=123123123
      drinks=Coke
      car=$PETER_CAR
      bike=Mountain bike
      

      并且将被搜索的思考将是PETER_CAR

      预期输出(用户只需要一次输入1个名称,预期输出是属性格式的一组数据,其中$ PLACEHOLDER替换为属性文件中的值):

      用户输入:Name=Bob

      name=Bob
      address=USA
      email=bob@hotshot.com
      phone=1234567
      

      用户输入:Name=Peter

      name=Peter
      address=France
      cell=123123123
      drinks=Coke
      car=Mazda
      bike=Mountain bike
      

      最终,我需要的脚本有这样的逻辑:

      1. 代表$
      2. 的每个字词
      3. sed -n '/name>'${name}'/,/<\/block>/s/.*<(.*)>(.*)<.*/\1=\2/p' sample.xml
      4. 的结果中
      5. 它将在该目录(或指定的属性文件)的所有属性文件中搜索该单词的值,
      6. 然后将$的单词替换为属性文件
      7. 中的值

        部分工作答案:

        Walter A的答案是使用cmd line(putty),但不是在Jsch exec中。 我一直收到No value found for token 'var'的错误。

3 个答案:

答案 0 :(得分:1)

下面的解决方案会多次查看属性文件,因此我认为有更快的解决方案。
下面的解决方案将帮助您开始使用小文件,您可能会对它感到满意。

# Question has a bash en ksh tag, choose the shebang line you want
# Make sure it is the first line without space or ^M after it.
#!/bin/ksh
#!/bin/bash
# Remove next line (debugging) when all is working
# set -x
for name in Bob Peter; do
   sed -n '/name>'${name}'/,/<\/block>/s/.*<\(.*\)>\(.*\)<.*/\1=\2/p' sample.xml |
      while IFS="\$" read line var; do
         if [ -n "${var}" ]; then
            echo "${line}$(grep "^${var}=" values[12].properties | cut -d= -f2-)"
         else
            echo "${line}"
         fi
      done
   echo
done

编辑:评论了两个可能的shebang行set -x并添加了输出。

结果:

name=Bob
address=USA
email=bob@hotshot.com
phone=1234567

name=Peter
address=France
cell=123123123
drinks=Coke
car=Mazda
bike=Mountain bike

答案 1 :(得分:1)

. values1.properties
. values2.properties
sed -n '/name>'${NAME}'/,/<\/block>/s/.*<\(.*\)>\(.*\)<.*/echo \1="\2"/p' sample.xml >output
. output

危险,而不是我喜欢的方式。

答案 2 :(得分:0)

基于sed的版本:

$ temp_properties=`mktemp`
$ NAME=Bob
$ sed '/./{s/^/s|$/;s/=/|/;s/$/|g/}' values*.properties > $temp_properties
$ sed -n '/name>'${NAME}'/,/<\/block>/s/.*<\(.*\)>\(.*\)<.*/\1=\2/p' sample.xml | sed -f $temp_properties

给出:

name=Bob
address=USA
email=bob@hotshot.com
phone=1234567

它确实存在脚本注入问题。但是,如果您信任values*.properties个文件&amp; NAME变量的内容,你很高兴。