转载自: 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. Andorid使用WiFi 连接adb进行调试

    无奈数据线连接常常掉线. 于是寻找wifi连接adb的方法,在github上搜索了一下client的源代码后编译后执行了下,发现能够行得通,于是记录一下. 相应的安卓client源代码在这wifi a ...

  2. Installation error: INSTALL_FAILED_VERSION_DOWNGRADE Android

    我们在安装新的 APk 的时候.会出现 Installation error: INSTALL_FAILED_VERSION_DOWNGRADE 原因:  是由于 androidversionCode ...

  3. node-npm/yarn

    很多人对npm或yarn了解甚少吧,下面我介绍一下常用的yarn/npm所谓的包管理工具. 首先我先介绍一下,npm属于国外Google镜像(下载贼慢),yarn属于Facebook开发的. npm: ...

  4. Oracle index unusable和invisible的差别

    摘录自11g的官方文档:      UNUSABLE Specify UNUSABLE to mark the index or index partition(s) or index subpart ...

  5. leetcode02-Add Two Numbers之beats98.68%Java版本号

    我的leetcode之旅,该篇章主要完毕使用Java实现算法. 这是第二篇Add Two Numbers 所有代码下载: Github链接:github链接,点击惊喜; 写文章不易.欢迎大家採我的文章 ...

  6. Python学习笔记_Python对象

    Python学习笔记_Python对象 Python对象 标准类型 其它内建类型 类型对象和type类型对象 Python的Null对象None 标准类型操作符 对象值的比較 对象身份比較 布尔类型 ...

  7. AWK学习总结(三) Records and Fields

    AWK 记录和域 The NR Variable % awk '{print NR, $0}' employees 1 Tom Jones 4424 5/12/66 543354 2 Mary Ada ...

  8. android studio 使用

    java5-7适用android,java8对安卓支持不好. mac osx 需要安装jdk8, google Nexus模拟器, Intellij是JetBrains发布的. Intellij有2个 ...

  9. YTU 2507: 李白打酒

    2507: 李白打酒 时间限制: 1 Sec  内存限制: 128 MB 提交: 414  解决: 186 题目描述 话说大诗人李白,一生好饮.幸好他从不开车.  一天,他提着酒壶,从家里出来,酒壶中 ...

  10. su 认证失败

    jiqing@ThinkPad:~$ su 密码: su:认证失败 jiqing@ThinkPad:~$ sudo passwd root [sudo] password for jiqing: 输入 ...