鱼C论坛

 找回密码
 立即注册
查看: 1570|回复: 2

python使用ssh连接linux服务器切换到root的问题

[复制链接]
发表于 2021-11-12 14:25:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #!/usr/env/bin python
  2. # -*- coding:utf-8 -*-
  3. # des:ssh登录系统,如果是非root帐号(普通帐号)登录采取行动,则su切换到root

  4. # python 的SSHV2 protocol协议实现,用于python调用各种ssh功能;
  5. import paramiko
  6. # python内置时间模块
  7. import time

  8. #根据用户名密码从普通用户揽权到root用记执行给定命令

  9. def ssh_su_root(ip,username,password,root_pwd,cmd):
  10. #建立SSHClient对象
  11.     myssh = paramiko.SSHClient()
  12. #设置自动接收公钥
  13.     myssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  14.     try:
  15. #使用给定用户名密码尝试连接服务器
  16.          myssh.connect(ip, 22, username=username, password=password, timeout=4)
  17.     except Exception as ex:
  18.         print (str(ex))
  19.         return
  20.     # 如果默认root不允许远程登录,提供的是普通用户帐号+root帐号,
  21.     #则调用invoke_shell,使用交互式shell方式切换同到root帐号,并执行命令。
  22.     if username != 'root':
  23.         print ("I am NOT root")
  24.         ssh = myssh.invoke_shell()
  25.         time.sleep(0.2)
  26.         ssh.send('su -\n')
  27.         buff = ''
  28.     #循环检测密码输入提示,出现后发送root口令,
  29.         while not (buff.endswith('Password:') or buff.endswith('密码: ')):
  30.     #从接收缓存中读入最多9999bytes数据。
  31.             resp = ssh.recv(9999)
  32.             buff += resp
  33.         ssh.send(root_pwd)
  34.         ssh.send('\n')
  35.         buff = ''
  36.     #循环检测#提示符,出现后执行传入的命令。
  37.         while not buff.endwith('# '):
  38.             resp = ssh.recv(9999)
  39.             buff += resp
  40.         ssh.send[cmd]
  41.         ssh.send('\n')
  42.         
  43.         buff =''
  44.     #循环检测#提示符,意味着命令执行完成,出现后关闭ssh连接并输出结果。
  45.         while not buff.endswith('# '):
  46.             resp = ssh.recv(9999)
  47.             buff += resp
  48.         myssh.close()
  49.         result = buff
  50.         print ("su root result --->",result)

  51.         myssh.close()
  52.     else:
  53.     #如果提供的是root帐号,则直接调用paramiko exec_command 方法,执行命令。
  54.         
  55.         print ("I am root")
  56.         stdin, stdout, stderr = myssh.exec_command(cmd)
  57.         stdin.write("Y")
  58.         print ("stdout.readlines() --->", stdout.readlines())
  59.         myssh.close()

  60. if __name__ == "__main__":
  61.     cmd = 'date'
  62.     ip = '172.16.10.12'
  63.     username = 'sysadmin'
  64.     password = 'Inspur1!'
  65.     ssh_su_root(ip, username, password, 'xxxxxxxxxxxx5', cmd)
  66.     username = 'root'
  67.     ssh_su_root(ip, username, password, 'xxxxxxxxxxxx', cmd)
复制代码
捕获.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-11-12 14:34:54 | 显示全部楼层
本帖最后由 suchocolate 于 2021-11-12 14:40 编辑

报错不全,尽量把报错信息贴全。

1)试试改成这样:buff += resp.decode()
3)另外第43行 ssh.send[cmd] 是不是写错了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-11-12 14:59:49 | 显示全部楼层
suchocolate 发表于 2021-11-12 14:34
报错不全,尽量把报错信息贴全。

1)试试改成这样:buff += resp.decode()

报错信息贴全了,就这些报错信息。改成resp.decode()我也试了,不会报错。但是会一直卡在不动的页面
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-1 07:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表