鱼C论坛

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

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

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

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

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

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)
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

1)试试改成这样:buff += resp.decode()
3)另外第43行 ssh.send[cmd] 是不是写错了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

报错信息贴全了,就这些报错信息。改成resp.decode()我也试了,不会报错。但是会一直卡在不动的页面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-27 07:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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