您的位置:首页 > 运维架构 > Linux

Linux下非交互式远程执行命令脚本(比ssh更好的方式)

2013-06-04 20:35 741 查看

背景

openssh在每台机器上都有,ssh与scp就像程序员的伴侣。

然而当要管理的机器规模越来越大时,ssh登陆到目标机器进行管理就变得不现实了。

虽然可以直接在ssh后面接命令的方式,进行命令的执行。

但是ssh的严格的权限认证使得我们不得不输入密码,或是建立信任关系,很难去自定义一个特定的认证方式。

用ssh的信任关系是可以的,不过认证文件要么被别人给删了,要么就是sshd的配置有问题。

当有一天我不得不去在100多台机器上,跑命令时。总是有那么20多台机器要输入密码。

懒人最讨厌重复做事,我也不例外。用sshpass,expect工具,搞定过一段时间,但是密码有时候也会被人改。

怒火中烧

的我,迫切的需要一种工具,它能够稳定的在任意一台机器上跑命令。直到遇到ssh的一个坑,终于成就了jetfire这块工具的诞生(这件事后面会提)。

解决方案

基于ssh的这种问题。于是笔者就写了一个jetfire,这个工具。

同ssh的守护进程sshd一样,它也有一个守护进程。与ssh区别最大的就是权限认证方式。可以指定一个程序进行认证,返回值0,就说明认证成功。



程序是用go语言写的,稳定性很高,静态编译,不用依赖什么jvm,python环境之类的。传递命令的时候使用了rpc技术。

jetfire的用法也很简单。

jetfire -h example.com 命令放在后面就可以了

eg: jetfire -h example.com echo hi boy

输出hi boy

对于多个机器的话,方法也很简单 jetfire -h example1.com,example2.com echo hi boy

执行结果就像这个样子。每个机器多会用标题标出来。成功提示SUCC,失败提示FAIL。



如果我们把机器列表写到一个文件里,比如host.list,结合xargs命令,可以写出更高级的方法

cat host.list | xargs -r -i{} jetfire -h {} echo hi boy

ssh的一个坑

ssh有一个潜在的bug,这个也是压死我的最后一颗稻草。

bug是这个样子。这里举个例子,假设目标机器是example.com

ssh example.com echo "hello     world"


执行这个命令,看到的输出,不是
hello     world
而是
hello world
猜测ssh是把 echo "hello world"这个命令,转化成字符串,然后用bash -c 去执行的。写jetfire的时候,顺便修了这个问题。

安装方法

安装也很简单, 下载https://github.com/shxsun/jetfire/blob/master/jetfire0.9-arm64.tar.gz,解压后, 切换到root,sh install.sh 就算安装上了, /etc/init.d/jetfirectl start启动服务进程。

权限认证可以修改/etc/jetfire.conf,去指定一个程序去认证,具体怎么写,官网也有说明。

更多高级的用法可以去参考http://github.com/shxsun/jetfire

好久没写过博客了,花了好久,终于写完了一篇博客。小鸟在快乐的唱歌,我在快乐的写文章。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: