在公司里, 常常要远程到很多机器上执行命令。机器列表会逐渐增多, 记忆这么多机器的IP或域名显然不是人脑所擅长的。因此, 需要保持一份SSH机器列表,从这些机器列表生成一个用于SSH到机器列表中机器的脚本, 执行该脚本就可以SSH到指定机器上。

必需文件:  sshlist.txt,  ssh_tpl.sh , updatessh.py  ;  输出文件:  ssh.sh

SSH 机器列表: sshlist.txt

127.0.0.0.1 ; 本地测试
1.1.1.1 ; 开发环境
2.2.2.2 ; 测试环境

SSH 脚本模板: ssh_tpl.sh

需要以机器列表生成的内容分别替换  ${ChooseList} 和 ${SSHList}

#!/bin/sh
while [ ]
do
echo "Choose host: "
${ChooseList}
read INPUT_VALUE
case "$INPUT_VALUE" in
${SSHList}
*)
echo -e "\033[43;31m invalid params-$INPUT_VALUE \033[0m";
;;
esac
done

生成最终SSH登录脚本的 python 程序: updatessh.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -------------------------------------------------------------------------------
# Name: updatessh.py
# Purpose: reads ssh list from sshlist.txt , replaces contents of ssh_tpl.sh
# and finally build a ssh.sh file to ssh specific machines
#
#
# Author: qin.shuq
#
# Created:
# Output: ssh.sh
#------------------------------------------------------------------------------- sshTplFilename = "ssh_tpl.sh"
sshlistFilename = "sshlist.txt"
sshscriptFilename = "ssh.sh"
username = "qin.shuq" def readSSHList():
f = open(sshlistFilename)
sshMachineList = []
i = 1
for line in f:
sshIp, comment = tuple(line.split(';'))
sshMachineList.append((i, sshIp.strip(), comment.strip()))
i+=1
f.close()
return sshMachineList def readFile(filename):
f = open(filename)
contents = ''
for line in f:
contents += line
f.close()
return contents def readSSHTpl():
return readFile(sshTplFilename) def main():
sshMachineList = readSSHList()
chooseListContents = ''
sshListContents = ''
for (i, sshIp, comment) in sshMachineList:
chooseListContents += "echo \" %d. %s ( %s ) \" \n" % (i, sshIp, comment)
sshListContents += "\t%d) \n\t\tssh %s@%s\n \t\t;; \n" % (i, username, sshIp) sshtplContents = readSSHTpl()
sshtplContents = sshtplContents.replace("${ChooseList}", chooseListContents).replace("${SSHList}", sshListContents) sshScriptFile = open(sshscriptFilename, 'w')
sshScriptFile.write(sshtplContents)
sshScriptFile.close() if __name__ == '__main__':
main()

最终生成的SSH登录脚本: ssh.sh

#!/bin/sh
while [ ]
do
echo "Choose host: "
echo " 1. 127.0.0.0.1 ( 本地测试 ) "
echo " 2. 1.1.1.1 ( 开发环境 ) "
echo " 3. 2.2.2.2 ( 测试环境 ) " read INPUT_VALUE
case "$INPUT_VALUE" in
)
ssh qin.shuq@127.0.0.0.
;;
)
ssh qin.shuq@1.1.1.1
;;
)
ssh qin.shuq@2.2.2.2
;; *)
echo -e "\033[43;31m invalid params-$INPUT_VALUE \033[0m";
;;
esac
done

使用:

当需要添加新的SSH机器时, 加入到 sshlist.txt , 以分号隔开 ip 地址 和 注释。 然后执行 python updatessh.py 即可生成最终用于登录的 ssh.sh 脚本。

为了少敲几个字符, 可以做个软连接:  ln -s  ssh.sh  /usr/bin/s

python实现动态更新远程机器列表的SSH登录脚本的更多相关文章

  1. fabric动态获取远程目录列表

    #!/usr/bin/pythonfrom fabric.api import *env.user='root'env.hosts=['172.10.224.183','172.10.224.132' ...

  2. git 更新远程分支列表

    git remote update origin --prune git remote update origin -p

  3. ssh-copy-id 命令自动复制本机公钥到远程机器

    ssh-copy-id 将本机的公钥复制到远程机器的authorized_keys文件中,ssh-copy-id能让你有到远程机器的home, ~./ssh , 和 ~/.ssh/authorized ...

  4. Android UI:机智的远程动态更新策略

    问题描述 做过Android开发的人都遇到过这样的问题:随着需求的变化,某些入口界面通常会出现 UI的增加.减少.内容变化.以及跳转界面发生变化等问题.每次发生变化都要手动修改代码,而入口界面通常具有 ...

  5. Python操作远程机器

    操作远程机器主要使用的有paramiko,WMI(Windows Management Instrumentation),SMBConnection. paramiko paramiko使用SSH2协 ...

  6. 基于Python实现matplotlib中动态更新图片(交互式绘图)

    最近在研究动态障碍物避障算法,在Python语言进行算法仿真时需要实时显示障碍物和运动物的当前位置和轨迹,利用Anaconda的Python打包集合,在Spyder中使用Python3.5语言和mat ...

  7. Python 软件热更新

    Python 软件热更新 本篇文章涉及技术知识如下: Redis threading 多线程 PyQt5 importlib 热更新 场景 咱们在平时运行一些长时间都会一直运行的软件(如:某些云同步软 ...

  8. 用最复杂的方式学会数组(Python实现动态数组)

    Python序列类型 在本博客中,我们将学习探讨Python的各种"序列"类,内置的三大常用数据结构--列表类(list).元组类(tuple)和字符串类(str). 不知道你发现 ...

  9. JSPatch – 动态更新iOS APP

    原文:http://blog.cnbang.net/works/2767/ JSPatch是最近业余做的项目,只需在项目中引入极小的引擎,就可以使用JavaScript调用任何Objective-C的 ...

随机推荐

  1. ArcGIS AddIN开发之COM对象写入注册表

    做一个交互式绘制文字的工具,希望这次设置的Symbol,下次打开ArcMap时自动调用这个Symbol,并支持对其进行修改. 解决方法是将这个Symbol写入注册表中,每次自动读取上一次设置的Symb ...

  2. 【HDU4419 Colourful Rectangle】 线段树面积并

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4419 题目大意:给你n个矩形,每个矩形都有一种颜色,矩形覆盖会出现另外一种颜色,问你所有矩形中不同的颜 ...

  3. SpringMVC如何接收application/json内容编码类型的参数?

    在上代码之前,有必要先说说@ResquestBody注解的含义: 1.官方解释如下: Annotation indicating a method parameter should be bound ...

  4. pt-table-checksum使用实践

    在工作中接触最多的就是mysql replication,由于现在公司也还在使用mysql 5.1.x版本,在复制方面还是比较多的问题,比如主库宕机或者从库宕机都会导致复制中断,通常我们需要进行人为修 ...

  5. centos重启不能自动联网的解决方法

    在命令行下输入 下面的ifcfg-eth0,eth0为我的网卡名字.机器之间不同,请先查看自己网卡的名字 vi /etc/sysconfig/network-scripts/ifcfg-eth0 进行 ...

  6. Openfire 的安装和配置

    1. 下载最新的openfire安装文件 官方下载站点:http://www.igniterealtime.org/downloads/index.jsp#openfire 下载地址: Exe:htt ...

  7. php课程---练习连接数据库及增删改

    方式一:用php中的内置函数来做 (适用于5.1之前的版本) //1.生成连接 $conn = mysql_connect("localhost","root" ...

  8. Windows内核 基本汇编指令

    1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...

  9. 【iCore3 双核心板】例程二十五:LAN_DNS实验——域名解析

    实验指导书及代码包下载: http://pan.baidu.com/s/1jHlBpqe iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  10. Yii源码阅读笔记(二十二)

    Module类,属性的注释和构造函数的注释: <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) ...