在公司里, 常常要远程到很多机器上执行命令。机器列表会逐渐增多, 记忆这么多机器的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. ICE——1.Printer

    一:打印机 1.Slice定义: interface Printer { void printString(string s); }; 我们的Slice定义含有一个接口,叫作Printer.目前,我们 ...

  2. Trie字典树 动态内存

    Trie字典树 #include "stdio.h" #include "iostream" #include "malloc.h" #in ...

  3. [LintCode] Wiggle Sort 扭动排序

    Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] < ...

  4. Rocky4.2下安装金仓v7数据库(KingbaseES)

    1.准备操作系统 1.1 系统登录界面 1.2 操作系统版本信息 jdbh:~ # uname -ra Linux jdbh -x86_64 # SMP Fri Dec :: CST x86_64 G ...

  5. OPPO某某產品拍攝範圍嶄露頭角

    手機熱風暴再次襲來.oppo 開闢新道路.OPPO爆料N3採用旋智能轉攝像頭!很青睞一些愛拍照的我們.愛攝影的我們.覺的代攝影機麻煩.OPPo同樣給你全新的視野新加坡自由行. 隨著OPPO N3發布會 ...

  6. HelloWorld的Sprint计划会议

    1.Sprint需求 编号 用户故事 故事价值 (点数) 1 作为一名小学生,我想要在玩电脑时玩一种 有趣的小游戏   2 作为一名不怎么爱玩大型游戏的白领(也喜欢玩迷宫游戏), 我想要玩一种可以在家 ...

  7. Socket请求和Http请求的各自特点、区别及适用场景

    Socket实现服务器与客户端之间的物理连接,并进行数据传输.主要有TCP/UDP两个协议.Socket处于网络协议的传输层.TCP:传输控制协议,面向连接的的协议,稳定可靠.当客户和服务器彼此交换数 ...

  8. bootstrap插件学习

    转自http://v3.bootcss.com/javascript/ bootstrap javascript插件学习 模态框 打开模态框 <button type="button& ...

  9. js中eval() 方法的使用以及一些特殊的使用方式

    1.eval方法只能在非严格模式中进行使用,在use strict中是不允许使用这个方法的. 2.eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值 ...

  10. Count Complete Tree Nodes || LeetCode

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * struct TreeNode *left; * s ...