需求
想象如下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.xml
22:51:09 Running...
22:51:11 Connected to tachyon@t84.briontech.com
22:51:12 Starting upload /home/weliu/Desktop/hello.txt to /h/data/users/weliu/hello.txt
Total size: 12
>> 100.00%
22:51:13 Finish to uploade
22:51:13 ssh cmd: cat /h/data/users/weliu/hello.txt
hello world
22:51:14 Starting upload /home/weliu/Desktop/ls_hello.sh to /h/data/users/weliu/ls_hello.sh
Total size: 37
>> 100.00%
22:51:15 Finish to uploade
22: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.txt
22: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