开始写代码代码比较长,所以我也放在在Github和码云,地址在文章最底部:1.我们建个模块目录osnssh(Open source noob ssh),然后在下面再建两个目录,一个用来放主程序取名叫bin吧,一个用来保存登录数据(IP, 端口,密码)叫data吧。-osnssh
-bin
-data1.设置程序:添加/删除IP,端口,密码. 建立py文件bin/setting.py:?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 | #!/usr/bin/env python #-*-coding:utf-8-*- word">import re, base64,
os, sys path
= os.path.dirname(os.path.abspath(sys.argv[ 0 ])) ''' 选项配置管理 __author__ = 'allen woo' ''' def add_host_main(): while 1 : if add_host(): break print ( "
Again:" ) def add_host(): ''' 添加主机信息 :return: ''' print ( "================Add=====================" ) print ( "[Help]Input
'#q' exit" ) #
输入IP host_ip
= str_format( "Host
IP:" , "^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]).(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]).(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9]).(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$" ) if host_ip
= = "#q" : return 1 #
输入端口 host_port
= str_format( "Host
port(Default 22):" , "[0-9]+" ) if host_port
= = "#q" : return 1 #
输入密码 password
= str_format( "Password:" , ".*" ) if password
= = "#q" : return 1 #
密码加密 password
= base64.encodestring(password) #
输入用户名 name
= str_format( "User
Name:" , "^[^
]+$" ) if name
= = "#q" : return 1 elif not name: os.system( "clear" ) print ( "[Warning]:User name cannot be emptyg" ) return 0 #
The alias #
输入别名 alias
= str_format( "Local
Alias:" , "^[^
]+$" ) if alias
= = "#q" : return 1 elif not alias: os.system( "clear" ) print ( "[Warning]:Alias cannot be emptyg" ) return 0 #
打开数据保存文件 of
= open ( "{}/data/information.d" . format (path)) hosts
= of.readlines() #
遍历文件数据,查找是否有存在的Ip,端口,还有别名 for l in hosts: l = l.strip( "
" ) if not l: continue l_list
= l.split( "
" ) if host_ip
= = l_list[ 1 ] and host_port
= = l_list[ 2 ]: os.system( "clear" ) print ( "[Warning]{}:{} existing" . format (host_ip,
host_port)) return 0 if alias
= = l_list[ 4 ]: os.system( "clear" ) print ( "[Warning]Alias '{}' existing" . format (alias)) return 0 of.close() #
save #
保存数据到数据文件 of
= open ( "{}/data/information.d" . format (path),
"a" ) of.write( "
{} {} {} {}
{}" . format (name.strip( "
" ),
host_ip.strip( "
" ), host_port,
password.strip( "
" ),
alias.strip( "
" ))) of.close() print ( "Add the
success:{} {}@{}:{}" . format (alias.strip( "
" ),
name.strip( "
" ),
host_ip.strip( "
" ), host_port,
password.strip( "
" ))) return 1 def remove_host(): ''' 删除主机信息 :return: ''' while 1 : #
打开数据文件 of
= open ( "{}/data/information.d" . format (path)) hosts
= of.readlines() of.close l = len (hosts) if l
< = 0 : os.system( "clear" ) print ( "[Warning]There is no host" ) return print ( "================Remove================" ) print ( "+{}+" . format ( "-" * 40 )) print ( "| Alias
UserName@IP:PORT" ) hosts_temp
= [] n = 0 #
遍历输出所以信息(除了密码)供选择 for i in range ( 0 ,
l): if not hosts[i].strip(): continue v_list
= hosts[i].strip().split( "
" ) print ( "+{}+" . format ( "-" * 40 )) print ( "| {} | {}
{}@{}:{}" . format (n + 1 ,
v_list[ 4 ],
v_list[ 0 ],
v_list[ 1 ],
v_list[ 2 ])) n + = 1 hosts_temp.append(hosts[i]) hosts
= hosts_temp[:] print ( "+{}+" . format ( "-" * 40 )) c = raw_input ( "[Remove]Choose the Number or Alias('#q' to
exit):" ) is_alias
= False is_y
= False try : c = int (c) if c > l
or c <
1 : os.system( "clear" ) print ( "[Warning]:There is no" ) continue del hosts[c - 1 ] is_y
= True except : is_alias
= True if is_alias: if c.strip()
= = "#q" : os.system( "clear" ) break n = 0 for l in hosts: if c.strip()
= = l.split( "
" )[ 4 ].strip(): del hosts[n] is_y
= True n + = 1 if not is_y: os.system( "clear" ) print ( "[Warning]:There is no" ) continue else :
#
save #
再次确认是否删除 c = raw_input ( "Remove?[y/n]:" ) if c.strip().upper() = = "Y" : of
= open ( "{}/data/information.d" . format (path),
"w" ) for l in hosts: of.write(l) print ( "Remove the
success!" ) of.close() def str_format(lable, rule): ''' 用于验证输入的数据格式 :param lable: :param rule: :return: ''' while 1 : print ( "{} ('#q'
exit)" . format (lable)) temp
= raw_input ().strip() m = re.match(r "{}" . format (rule),
temp) if m: break elif "port" in lable: temp
= 22 break elif temp.strip()
= = "#q" : os.system( "clear" ) break os.system( "clear" ) print ( "[Warning]:Invalid format" ) return temp |
2. 我们再添加一个函数在setting.py用于输出我们的信息,也就是about me。?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | def about(): ''' 输出关于这个程序的信息 :return: ''' of
= open ( "{}/bin/about.dat" . format (path)) rf
= of.read() try : info
= eval (rf) os.system( "clear" ) print ( "================About osnssh================" ) for k,v
in info.items(): print ( "{}:
{}" . format (k,
v)) except : print ( "For
failure." ) return |
然后在bin目录下面建立个文件about.dat写入我们的一些信息
1 2 3 4 5 6 7 8 | { "auther" : "Allen
Woo" , "Introduction" : "In Linux or
MAC using SSH, do not need to enter the IP and password for many
times" , "Home
page" :"", "version" : "1.1.0" , "email" : "xiaopingwoo@163.com" } |
好了设置程序就这样了:2. 自动登录远程服务器程序:在bin建个py文件叫auto_ssh.py:安装pexpect:pip install pexpect然后开始写代码:?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | #!/usr/bin/env python #-*-coding:utf-8-*- import os, sys,
base64 import pexpect path
= os.path.dirname(os.path.abspath(sys.argv[ 0 ])) def choose(): #
打开我们的数据文件 of
= open ( "{}/data/information.d" . format (path)) hosts
= of.readlines() hosts_temp
= [] for h in hosts: if h.strip(): hosts_temp.append(h) hosts
= hosts_temp[:] l = len (hosts) if l
< = 0 : os.system( "clear" ) print ( "[Warning]Please add the host server" ) return while 1 : print ( "=================SSH===================" ) print ( "+{}+" . format ( "-" * 40 )) print ( "| Alias
UserName@IP:PORT" ) for i in range ( 0 ,
l): v_list
= hosts[i].strip().split( "
" ) print ( "+{}+" . format ( "-" * 40 )) print ( "| {} | {}
{}@{}:{}" . format (i + 1 ,
v_list[ 4 ],
v_list[ 0 ],
v_list[ 1 ],
v_list[ 2 ])) print ( "+{}+" . format ( "-" * 40 )) c = raw_input ( "[SSH]Choose
the number or alias('#q' exit):" ) is_alias
= False is_y
= False try : c = int (c) if c > l
or c <
1 : os.system( "clear" ) print ( "[Warning]:There is no" ) continue l_list
= hosts[c - 1 ].split( "
" ) name
= l_list[ 0 ] host
= l_list[ 1 ] port
= l_list[ 2 ] password
= l_list[ 3 ] is_y
= True except : is_alias
= True if is_alias: if c.strip()
= = "#q" : os.system( "clear" ) return for h in hosts: if c.strip()
= = h.split( "
" )[ 4 ].strip(): l_list
= h.split( "
" ) name
= l_list[ 0 ] host
= l_list[ 1 ] port
= l_list[ 2 ] password
= l_list[ 3 ] is_y
= True if not is_y: continue #
ssh #
将加密保存的密码解密 password
= base64.decodestring(password) print ( "In the
connection..." ) #
准备远程连接,拼接ip:port print ( "{}@{}" . format (name,
host)) if port
= = "22" : connection( "ssh
{}@{}" . format (name, host),
password) else : connection( "ssh
{}@{}:{}" . format (name, host,
port), password) def connection(cmd, pwd): ''' 连接远程服务器 :param cmd: :param pwd: :return: ''' child
= pexpect.spawn(cmd) if ( i
= = 0 ): #
如果交互中出现.*password.*,就是叫我们输入密码 #
我们就把密码自动填入下去 child.sendline( "{}
" . format (pwd)) child.interact() elif ( i
= = 1 ): #
如果交互提示是否继续,一般第一次连接时会出现 #
这个时候我们发送"yes",然后再自动输入密码 child.sendline( "yes
" ) child.sendline( "{}
" . format (pwd)) #child.interact() else : #
连接失败 print ( "[Error]The
connection fails" ) |
好了,现在我们只需要启动文件了,也就是打开程序后的第一个菜单3.再osnssh目录下建个osnssh.py 文件:?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | #!/usr/bin/env python #-*-coding:utf-8-*- import os,
sys sys.path.append( "../" ) from bin import setting,
auto_ssh path
= os.path.dirname(os.path.abspath(sys.argv[ 0 ])) ''' 方便在LINUX终端使用ssh,保存使用的IP:PORT , PASSWORD 自动登录 __author__ = 'allen woo' ''' def main(): while 1 : print ( "==============OSNSSH [Menu]=============" ) print ( "1.Connection
between a host
2.Add host
3.Remove host
4.About
[Help]: q:quit clear:clear
screen" ) print ( "=" * 40 ) c = raw_input ( "Please select
a:" ) if c = = 1 or c = = "1" : auto_ssh.choose() if c = = 2 or c = = "2" : setting.add_host_main() if c = = 3 or c = = "3" : setting.remove_host() if c = = 4 or c = = "4" : setting.about() elif c = = "clear" : os.system( "clear" ) elif c = = "q" or c = = "Q" or c = = "quit" : print ( "Bye" ) sys.exit() else : print ( "
" ) if __name__
= = '__main__' : try : of
= open ( "{}/data/information.d" . format (path)) except : of
= open ( "{}/data/information.d" . format (path),
"w" ) of.close() main() |
终于写完了,我们可以试一试了:$python osnssh.py