在公司里, 常常要远程到很多机器上执行命令。机器列表会逐渐增多, 记忆这么多机器的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. Qt Load and Save Image Dialog 加载图片对话框

    在Qt中,我们想要通过对话框来打开某一个图片,可以通过使用QFileDialog来快速实现,参见以下代码: QString fileName = QFileDialog::getOpenFileNam ...

  2. [CareerCup] 15.5 Denormalization 逆规范化

    15.5 What is denormalization? Explain the pros and cons. 逆规范化Denormalization是一种通过添加冗余数据的数据库优化技术,可以帮助 ...

  3. mysql 的2个关于事务和安全性的参数

    innodb_flush_log_at_trx_commit:(mysql写事物日志的方式) 0 log buffer 会每秒写入到日志文件中,并刷新到磁盘  (提交方式与事物无关,性能最好) 1 事 ...

  4. JS开发HTML5游戏《神奇的六边形》(二)

    近期出现一款魔性的消除类HTML5游戏<神奇的六边形>,今天我们一起来看看如何通过开源免费的青瓷引擎(www.zuoyouxi.com)来实现这款游戏. (点击图片可进入游戏体验) 因内容 ...

  5. Hibernate的一级二级缓存机制配置与测试

    特别感谢http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session ...

  6. c++ basic 整理1

    //c++类 初始化 与 初始赋值 //C++规定 对象的 成员变量 初始化 动作发生 在进入 构造函数本体 之前 . 在构造函数内 成员变量赋值都属于 赋值 . class People { pub ...

  7. 4s使用iOS 8的一些真實感受

    iPhone永遠離不開史上手機的爭論!你是否也在用呢? 今年iPhone 6/6Plus的發佈和上市可以說是振奮人心,大螢幕的升級.圓潤的外觀改變.全新的iOS 8系統,都是極具吸引力的.作為一名互聯 ...

  8. Python学习笔记——部分常用/特殊用法

    1.使用*号来展开序列,*是序列展开,每个元素都当做一个参数.ls = (1, 2, 3);foo(ls),这样foo只有一个参数,就是ls这个列表本身foo(*ls), foo得到3个参数,分别为1 ...

  9. HTTP常见错误代码总结

    1.HTTP 401 用户验证失败.不允许继续访问 2.HTTP 403 禁止访问,访问web应用,没有指定要访问页面的名称 3.HTTP 404 请求的文件找不到,一般情况是在浏览器输入地址时,输入 ...

  10. JavaScript 入门教程一 开篇介绍

    一.JavaScript 刚开始是为了解决一些由服务器端进行的验证而开发的前端语言.在宽带还不普及的90年代,当用户辛苦输入很多信息并提交给服务器后,等了漫长的时间,等到的不是提交成功的提示而是某些必 ...