|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #!/usr/env/bin python
- # -*- coding:utf-8 -*-
- # des:ssh登录系统,如果是非root帐号(普通帐号)登录采取行动,则su切换到root
- # python 的SSHV2 protocol协议实现,用于python调用各种ssh功能;
- import paramiko
- # python内置时间模块
- import time
- #根据用户名密码从普通用户揽权到root用记执行给定命令
- def ssh_su_root(ip,username,password,root_pwd,cmd):
- #建立SSHClient对象
- myssh = paramiko.SSHClient()
- #设置自动接收公钥
- myssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- try:
- #使用给定用户名密码尝试连接服务器
- myssh.connect(ip, 22, username=username, password=password, timeout=4)
- except Exception as ex:
- print (str(ex))
- return
- # 如果默认root不允许远程登录,提供的是普通用户帐号+root帐号,
- #则调用invoke_shell,使用交互式shell方式切换同到root帐号,并执行命令。
- if username != 'root':
- print ("I am NOT root")
- ssh = myssh.invoke_shell()
- time.sleep(0.2)
- ssh.send('su -\n')
- buff = ''
- #循环检测密码输入提示,出现后发送root口令,
- while not (buff.endswith('Password:') or buff.endswith('密码: ')):
- #从接收缓存中读入最多9999bytes数据。
- resp = ssh.recv(9999)
- buff += resp
- ssh.send(root_pwd)
- ssh.send('\n')
- buff = ''
- #循环检测#提示符,出现后执行传入的命令。
- while not buff.endwith('# '):
- resp = ssh.recv(9999)
- buff += resp
- ssh.send[cmd]
- ssh.send('\n')
-
- buff =''
- #循环检测#提示符,意味着命令执行完成,出现后关闭ssh连接并输出结果。
- while not buff.endswith('# '):
- resp = ssh.recv(9999)
- buff += resp
- myssh.close()
- result = buff
- print ("su root result --->",result)
- myssh.close()
- else:
- #如果提供的是root帐号,则直接调用paramiko exec_command 方法,执行命令。
-
- print ("I am root")
- stdin, stdout, stderr = myssh.exec_command(cmd)
- stdin.write("Y")
- print ("stdout.readlines() --->", stdout.readlines())
- myssh.close()
- if __name__ == "__main__":
- cmd = 'date'
- ip = '172.16.10.12'
- username = 'sysadmin'
- password = 'Inspur1!'
- ssh_su_root(ip, username, password, 'xxxxxxxxxxxx5', cmd)
- username = 'root'
- ssh_su_root(ip, username, password, 'xxxxxxxxxxxx', cmd)
复制代码 |
-
|