收藏 分销(赏)

使用prarmiko模块切换root执行命令.docx

上传人:仙人****88 文档编号:12021378 上传时间:2025-08-28 格式:DOCX 页数:6 大小:15.53KB 下载积分:10 金币
下载 相关 举报
使用prarmiko模块切换root执行命令.docx_第1页
第1页 / 共6页
使用prarmiko模块切换root执行命令.docx_第2页
第2页 / 共6页


点击查看更多>>
资源描述
Paramiko模块是非常优秀的ssh连接库。 通常使用paramiko.SSHClient类型的exec_command来执行命令,返回一个包含了代表标准输入、标准输出、标准错误的三个元素的元祖。通过操作这三个ChannelFile对象可以获取到命令的标准输出,以及命令的退出状态,并且如果命令没有执行完成,获取标注输出或退出状态时,进程将被阻塞,直到命令执行完成,还可以使用标准输入完成简单的交互操作,具体的使用方式,参见Paramiko使用 exec_command很方便,但也有不足之处,很多linux环境都是禁止root直接登录的,而使用exec_command无法完成su – root这种交互方式的切换命令,执行时进程将被永久阻塞。 invoke_shell方法,用于创建一个子shell进程,这样所有的操作都可以在该子shell中进程,su切换用户操作不受影响,但该方法没有exec_command那种方便的ChannelFile对象,所有的标准输出和标准错误内容通过invoke_shell返回对象的recv方法来获取,每一次调用recv只会从上一次返回的地方开始返回,也没有直接获取命令退出状态的方法,不过这些缺点可以通过代码来实现。 import paramiko import time def _shell_exec(shell, cmd, sleep, is_exec=True): if is_exec: #执行shell命令 shell.send(cmd + '\n') time.sleep(sleep) #recv方法返回收集到的shell命令的标准输出和标准错误。 #参数为返回多少个自己节数的标准输出和标准错误,值应该大于实际的返回,这样才能保证输出的完整 stdout = shell.recv(1024 * 100) #按行分割得到的信息 out_list = stdout.decode().split('\n') return out_list def main(): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.MissingHostKeyPolicy()) ssh.connect('192.168.1.28',22,'test','huawei') #invoke_shell方法,创建一个子shell,所有的命令都在该shell中进行。 shell = ssh.invoke_shell() print('Begin to su root ...') out_list = _shell_exec(shell, 'su - root', 1) last_str = out_list[len(out_list) - 1].strip() #获取的linux系统的标准输出和标准错误按行分割后 #第一行内容为传递的linux命令,最后一行在无交互时,内容应该为PS1变量的值 #否则应该是交互的输出信息,切换root为交互操作,最后一行的内容应该为"Password:" if not last_str.endswith('Password:'): raise ValueError("Failed to exec su root") out_list = _shell_exec(shell, 'huawei', 5) result_str = out_list[len(out_list) - 2].strip() #输入密码后,交互完成,此时最后一行应该为PS1变量的值 #单数第二行如何出现failure内容,则表示root密码输入错误,切换失败 if result_str.endswith('failure'): raise ValueError("Authentication failure,please check root's password") print('Successfully') cmd_list = list() #第一条命令是更改PS1变量,即标识符的样式 #每条命令执行完成后,都会返回到标识符,通过判断命令输出的最后是否等于PS1即可判断命令是否执行完成 cmd_list.append('export PS1="[\\u] #";echo $?') cmd_list.append('whoami;echo $?') cmd_list.append('pwd;echo $?') cmd_list.append('cd /opt;bash test.sh;echo $?') cmd_list.append('cd /opt;bash test2.sh;echo $?') cmd_list.append('pwd;echo $?') #逐条执行数组中的命令 print('Begin to exec command ...') for cmd in cmd_list: print('"{0}" ...'.format(cmd)) out_list = list() #声明一个列表变量,然后将shell返回的标准输出和标准错误分割后的列表元素添加到列表 #这样做是为了得到所有的标准输出和标准错误, #因为每一次执行recv,返回的内容将从上次一次获取后的地方开始,得到的标准输出和标准错误将不完整 out_list.extend(_shell_exec(shell, cmd, 1)) last_str = out_list[len(out_list) - 1].strip() #通过循环,判断返回的列表最后一个元素是否等于为PS1变量,来判断命令是否执行完成 while not last_str.endswith('[root] #'): print('"{0}" is not finsh,please writing ...'.format(cmd)) out_list.extend(_shell_exec(shell, cmd, 1, False)) last_str = out_list[len(out_list) - 1].strip() result_str = out_list[len(out_list) - 2].strip() if result_str != '0': print('Failed to exec "{0}",error message is as follows'.format(cmd)) #输出列表中,除去第一个和最后个即为命令的标准输入和标准错误 for i in out_list[1:len(out_list)-1]: if i != '': print(' {0}'.format(i)) else: print('"{0}" ... done'.format(cmd)) ssh.close() if __name__ == '__main__': main()
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服