sshutil工具介绍:一个跨机器的脚本执行器

来源:互联网 发布:淘宝仅退款不退货规则 编辑:程序博客网 时间:2024/06/05 16:14

需求

想象如下Case:
1. 我们本地有一个文件,需要上传到远程计算机上;
2. 我们需要运行远程计算机上的命令来的这个文件进行操作;
3. 我们可以上传一个脚本到远程计算机上;
4. 我们可以远程执行这个脚本。

对于这个Case,我们每一步都要手动操作。我有个想法,就是把整个过程都脚本化,在本地写一个脚本,通过设计的一个工具运行一下,就可以完成这一系列上传、远程执行的操作。

sshutil的XML"脚本"

SshUtil就是这样一个工具,它通过编写一个XML作为“脚本”,然后sshutil命令行解析运行这个脚本。上面的Case,我们可以编写如下的XML脚本:

<?xml version="1.0" encoding="utf-8" standalone="yes"?><sshutil>  <name>update_hello_to_t84_and_ssh</name>  <server>    <host>t84</host>    <user>tachyon</user>    <passwd>xxxxxx</passwd>  </server>  <upload id="upload_hello">    <from>/home/weliu/Desktop/hello.txt</from>    <to>/h/data/users/weliu</to>  </upload>  <upload id="upload_ls_hello_sh">    <from>/home/weliu/Desktop/ls_hello.sh</from>    <to>/h/data/users/weliu</to>  </upload>  <cmds>    <cmd type="upload">upload_hello</cmd>    <cmd type="ssh">cat /h/data/users/weliu/hello.txt</cmd>    <cmd type="upload">upload_ls_hello_sh</cmd>    <cmd type="ssh">bash /h/data/users/weliu/ls_hello.sh</cmd>  </cmds></sshutil>

下面对该XML脚本各标签的含义进行分析:
1. name:是我们定义的脚本名,说明这个脚本的作用。
2. server:定义远程计算机的主机名host,登录用户名user,密码passwd。
3. upload:定义上传的操作,可以有多个不同id的upload节点。
(1) id: 定义该upload操作的标识符,用于区分不同的upload操作
(2) from:定义本地需要上传的文件路径(目前还不支持文件夹,后续版本将支持)
(3) to:定义期望上传到的远程计算机的文件夹路径(若文件夹不存在,则创建)
4. cmds: 定义需要执行的一系列命令,子节点为cmd标签,执行顺序与为从上到下。
5. cmd:定义一个执行命令,更加type指定不同的命令类型:
(1) type="upload",上传文件到远程机器,节点的值为upload节点的id
(2) type="ssh", 通过ssh执行远程命令,节点的值为远程的命令
(3) type="local"或者不写type, 执行本地命令,节点值为本地命令(目前不支持,后续版本将支持)
(4) type="download",从远程机器下载文件,节点的值为download节点的id(目前不支持,后续版本将支持)

通过阅读上面的XML脚本,主要每个cmd的顺序,我们可以知道这个XML脚本的意图:
1. 上传本地文件/home/weliu/Desktop/hello.txt到远程机器t84的/h/data/users/weliu路径下
2. 执行远程命令cat /h/data/users/weliu/hello.txt
3. 上传本地bash脚本文件/home/weliu/Desktop/ls_hello.sh到远程机器t84的/h/data/users/weliu路径下
4. 远程执行这个bash脚本。

测试文件如下:
/home/weliu/Desktop/hello.txt文件的内容是:hello world
/home/weliu/Desktop/ls_hello.sh文件的内容是:ls -l /h/data/users/weliu/hello.txt


运行sshutil工具

使用sshutil工具,执行该XML脚本(假设该XML脚本文件名为:demo.xml), 命令行如下:

java -jar sshutil.jar -f demo.xml

运行结果如下:

22:50:55 Loading file: /home/weliu/code/sshutil/sshutil/org.wenzhe.sshutil.cmdline/src/test/resources/demo.xml22:51:09 Running...22:51:11 Connected to tachyon@t84.briontech.com22:51:12 Starting upload /home/weliu/Desktop/hello.txt to /h/data/users/weliu/hello.txtTotal size: 12>> 100.00%22:51:13 Finish to uploade22:51:13 ssh cmd: cat /h/data/users/weliu/hello.txthello world22:51:14 Starting upload /home/weliu/Desktop/ls_hello.sh to /h/data/users/weliu/ls_hello.shTotal size: 37>> 100.00%22:51:15 Finish to uploade22:51:15 ssh cmd: bash /h/data/users/weliu/ls_hello.sh-rw-r--r-- 1 tachyon tachyon 12 Jun 10 07:51 /h/data/users/weliu/hello.txt22:51:16 Done!

有输出信息可知,任务已经成功完成!

源码

可以在Perforce上下载sshutil的源码:

//users/BCTools/sshutil

TODO List


1. 支持下载文件(只需要为Command抽象类增加一个DownloadCommand,并且实现CmdHandler接口)
2. 支持运行本地脚本(也很简单)
3. 改进脚本的编写,可以考虑用Groovy DSL (领域专用语言),提供可读性和以编写性。
4. 支持对文件夹进行上传/下载

5. 设计一个Eclipse插件,通过UI配置更新XML脚本,在Console窗口显示结果。

6. 可以给特定应用定制一些设置模板,在Plugin GUI中直接操作。

7. 密码可以填也可以不填,不填的话运行时会提示用户输入密码,防止密码泄露。

8. 修复Bug,可以没有Upload节点

9. 支持判断cmd的执行结果,决定是否继续执行

10. 支持TASK-6002, 需求是在windows上开eclipse, 然后同步代码到linux, 编译,测试




---------------------- 本博客所有内容均为原创,转载请注明作者和出处 -----------------------

 作者:刘文哲

 联系方式:liuwenzhe2008@qq.com

 博客:http://blog.csdn.net/liuwenzhe2008

-------------------------------------------------------------------------------------------------------------


0 0
原创粉丝点击