转载自: http://www.taskctl.com/forum/detail_129.html

上次写了一个帖子 TASKCTL中不使用代理,通过ssh免密连接执行远程脚本配置(SSH插件扩展)http://www.taskctl.com/forum/detail_122.html 。写完后发现,其实在原本的sh作业类型上改造一下就可以了,同时延伸到以前是用command执行方式的作业类型,都可以适当扩展,命令行类插件升级20171110.rar就是 sh、exe、python的插件和新增拷贝一些小文件的scp作业类型。插件中主要使用的ssh免密及其相关的几个参数和bash的几种模式,这个只是一个基础版本,如果有特殊的需求基于上面的插件改造一下就可以了。下面是摘抄了原网页上写法写的一个sh脚本的扩展,其他几个类似。

使用TASKCTL调度服务时,如果需要跨用户或者跨服务器调度可以通过安装taskctl的代理来实现,但有时需要执行作业的服务器上仅仅只有几个脚本或者一两个可执行程序,此时再部署代理,就显得有点得不偿失了。我们知道TASKCTL支持任意作业类型的扩展,所以我们是不是可以考虑通过SSH远程连接来扩展这些插件,使其能执行这些远程少量的脚本程序。

下面是通过扩展TASKCTL用ssh连接来支持调度远程作业的步骤,一方面解决一些朋友迫切的调度需求,另一方面抛砖引玉,让大家能够在TASKCTL中扩展更多的适应自己需求的作业插件。

下面编写的过程参照 http://www.taskctl.com/forum/detail_33.html 。

1、首先在服务端的$TASKCTLDIR/src/plugin/sh/shell/目录中新增cprunsh.sh作业插件,实际上就是一个shell程序,代码如下:

#!/bin/sh
#------------------------------------------------------------------------------
# 功能: [ssh方式]执行[远程]Shell脚本驱动插件程序
#
# 更新日志:20171030 由最开始的集成转换为插件,增强扩展原只能执行当前用户可读的 shell 脚本,
# 通过ssh协议,在免密的情况下可以执行本机不同用户和非本机的其他用户
#
# 参数:
# 1. progname 脚本的全路径名称
# 2. para 脚本的入口参数,格式为 para1 para2 ...
# 3. exppara 对应相应脚本的exppara属性,为脚本文件所在用户,当该参数为空时,默认为当前用户,如果不是当前用户时,为远程连接IP地址和用户名
# sip=172.22.1.1 ssh远程IP地址
# sport=9527 ssh远程连接端口
# suser=taskctl ssh远程用户
# 返回值: 脚本执行后的实际返回值
#
# 流程模式代码任务定义举例:
# 1、默认2个输入参数的安装用户可执行的服务器上的sh脚本(如果参数多个,以此类推)
# <sh>
# <name>job1</name>
# <progname>/home/taskctl/test.sh</progname>
# <para>para1 para2</para>
# </sh>
# 2、在同一台服务器上的其他用户可执行,当前节点安装用户不可执行sh脚本,当前用户和目标用户做了ssh免密(如果参数多个,以此类推)
# <sh>
# <name>job1</name>
# <progname>/home/username/test.sh</progname>
# <para>para1 para2</para>
# <exppara>[sport=22,]suser=taskctl</exppara>
# </sh>
# 3、不同服务器上,但都是shell作业,当前节点安装用户已经做了ssh免密(如果参数多个,以此类推)
# <sh>
# <name>job1</name>
# <progname>/home/username/test.sh</progname>
# <para>para1 para2</para>
# <exppara>sip=172.22.1.1,[sport=22,]suser=taskctl</exppara>
# </sh>
#
#------------------------------------------------------------------------------ if [ $# -ne 3 ]
then
echo "Param error !"
echo "Usage: $0 progname para expara"
exit 126
fi #------------------------------------------------------------------------------
# 第一步: 接收参数
#------------------------------------------------------------------------------
ProgName=$1
Para=$2
ExpPara=$3 #------------------------------------------------------------------------------
# 第二步: 解析 exppara
#------------------------------------------------------------------------------
function getValue(){
if [ $# -ne 2 ]
then
echo "......."
exit 1
fi str=`echo $2|awk -v record=$1 'BEGIN {
split(record,myarray,","); }
END{
for (i in myarray){
if (myarray[i]~$1){
if ( index(myarray[i],$1) == 1){
print myarray[i];
break;
}
}
}
}
'`
echo $str|awk -F"=" '{print $2}'
} ExpPara=`echo $ExpPara` #此处为了去前后空格,以便判断是否真正有入口参数
#通过判断 exppara 是否为空,决定是直接执行sh还是走ssh通道
#直接执行
if [ ! -n "$ExpPara" ]
then
sh $ProgName $Para
ret=$?
exit $ret
fi
#走ssh通道
sip=`getValue $ExpPara sip`
#通过判断 sip 是否为空,决定是直接执行本机其他用户还是远程服务器上的sh脚本
if [ ! -n "$sip" ]
then
sip=localhost
fi
#sport=`getValue $ExpPara sport` #默认没有修改端口 传参数的时候也没有传 先屏蔽
sport=22
suser=`getValue $ExpPara suser` #------------------------------------------------------------------------------
# 第三步: 检测是否配置了ssh免密连接
#------------------------------------------------------------------------------
ssh -o ConnectTimeout=5 -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip 'pwd' &>/dev/null
if [ $? != 0 ];then
echo -e "\nSSH Connection failed $sip"
echo -e "\nssh-keygen -t rsa -P ''"
echo -e "\nssh-copy-id -p $sport $suser@$sip"
exit 1
else
echo -e "\nSSH connection succeeded $sip"
fi #------------------------------------------------------------------------------
# 第四步: 运行JOB,并返回结果
#------------------------------------------------------------------------------
#echo "ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip bash --login $ProgName $Para" #此处为打印执行命令行,以便调试判断是否真正有入口参数
ssh -o NumberOfPasswordPrompts=0 -o StrictHostKeyChecking=no -p $sport $suser@$sip "bash --login $ProgName $Para"
ret=$?
exit $ret

2、在桌面软件admin中进入"任务类型"功能中,设置ssh作业类型,如下图所示:

3、在桌面软件designer中设计 sh 作业如下代码片段:

<!-- 按插件的规则编写的流程设置 -->
<sh>
<name>MainModul_JobNode0</name>
<progname>/home/cdchen/successjob.sh</progname>
<para>para1 para2</para>
<exppara>sip=192.168.0.192,suser=cdchen</exppara>
<jobdesc>测试远程sh作业</jobdesc>
</sh>

4、调试测试作业是否符合预期

taskctl命令行类(sh、exe、python新增scp)插件升级扩展的更多相关文章

  1. 命令行工具aspnet_regiis.exe实现加密和解密web.config

    命令行工具aspnet_regiis.exe,是一个类似于DOS的命令工具,称之为命令解释器.使用命令行工具加密和解密web.config文件中的数据库连接字符串时,只需要简单的语法命令即可. 加密语 ...

  2. 如何在命令行模式下查看Python帮助文档---dir、help、__doc__

    如何在命令行模式下查看Python帮助文档---dir.help.__doc__ 1.dir函数式可以查看对象的属性,使用方法很简单,举str类型为例,在Python命令窗口输入 dir(str) 即 ...

  3. 命令行工具osql.exe使用

    目标: 快速在21个库修改Test表的某条记录,这几个库都分别在不同的服务器上. 通常会想到,到每个库都执行一下语句不就好了吗?这个数据库切换来切换去,挺麻烦了,通过命令行工具osql.exe就可以快 ...

  4. PHP命令行执行程序php.exe使用及常用参数

    PHP命令行执行程序php.exe参数说明 -f <file>:以命令行方式运行指定的PHP文件,只要指定具体的PHP文件(带绝对路径),php.exe就可以执行PHP文件,所以这个参数单 ...

  5. MongoDB远程连接-命令行客户端mongo.exe

    命令行客户端mongo.exe 位于安装目录bin子目录下.MongoDB的所有可执行程序都在其中. 双击打开mongo.exe应该是默认连接本地数据库服务,因此需要用Cmd或Powershell的方 ...

  6. 在命令行模式下查看Python帮助文档---dir、help、__doc__

    在命令行模式下查看Python帮助文档---dir.help.__doc__   1.dir函数式可以查看对象的属性,使用方法很简单,举str类型为例,在Python命令窗口输入 dir(str) 即 ...

  7. 让 windows 下的命令行程序 cmd.exe 用起来更顺手

    在 Windows 下使用 Larave 框架做开发,从 Composer 到 artisan 总是避免不了和 cmd.exe 打交道,系统默认的命令行界面却是不怎么好看,且每行显示的字符数是做了限制 ...

  8. Windows命令行下pip安装python whl包

    因为做网页爬虫,需要用到一个爬新闻的BeautifulSoup 的包,然后再关网上下的是whl包,第一次装,虽然花了点时间,最后还是装上去了,记录一下,方便下次. 先发一下官方文档地址.http:// ...

  9. 【Apache ZooKeeper】命令行zkCli.sh使用指南

    ZooKeeper命令行 原文                   http://blog.csdn.net/ganglia/article/details/11606807 ZooKeeper客户端 ...

随机推荐

  1. linux网络编程中的shutdown()与close()函数

    1.close()函数 int close(int sockfd); //返回成功为0,出错为-1 close 一个套接字的默认行为是把套接字标记为已关闭,然后立即返回到调用进程,该套接字不能再由cl ...

  2. 【Python】python扩展

    当python的基本功能无法满足要求.或者是为了保密源码(.py).遇到性能瓶颈时,我们经常要扩展python,扩展语言能够是C/C++.Java.C#等. 为python创建扩展须要三个基本的步骤: ...

  3. apache ab 測试 apr_socket_connect(): 因为目标机器积极拒绝 无法连接

    遇到这样的情况通常是你开的并行数量太多了... 比如:ab -c 1000 -n 10000 http://localhost/index.html 如此大的请求就会挂掉,只是还是有补救措施的,能够通 ...

  4. RHEL6.5上Oracle ACFS与Linux samba一起使用时遇到的bug

    RHEL上的Oracle ACFS与linux samba一起使用时遇到的bug 一.环境介绍: cat /etc/issue的结果为: Red Hat Enterprise Linux Server ...

  5. js location对象相关命令

    Location.href 返回整个当前url,若对其赋值:location.href="http://www.sina.com.cn"则跳转其urllocation.host 返 ...

  6. poj 3233(矩阵高速幂)

    题目链接:http://poj.org/problem?id=3233. 题意:给出一个公式求这个式子模m的解: 分析:本题就是给的矩阵,所以非常显然是矩阵高速幂,但有一点.本题k的值非常大.所以要用 ...

  7. MySQL-查询数据(SELECT)

    MySQL SELECT语句 SELECT语句用于从表或视图中获取数据 Select语句组成 Select 之后是逗号分隔列或星号(*)的列表,表示要返回所有列. From 指定要查询数据的表或视图. ...

  8. [Java] 监控java对象回收的原理与实现

    监控Java对象回收的原理与实现 一.监控Java对象回收的目的 监控Java对象是否回收的目的是:为了实现内存泄露报警. 内存泄露是指程序中对象生命周期(点击查看详情)已经进入不可见阶段,但因为编码 ...

  9. 【bzoj1452】[JSOI2009]Count

    二维树状数组 #include<iostream> #include<cstdio> #include<cstring> using namespace std; ...

  10. YTU 2639: 改错题:类中私有成员的访问

    2639: 改错题:类中私有成员的访问 时间限制: 1 Sec  内存限制: 128 MB 提交: 431  解决: 297 题目描述 /* 改错题: 设计一个日期类和时间类,并编写全局函数displ ...