Python实现一个类似Xshell登录系统的效果

秋天是秋高气爽、秋风瑟瑟的季节。农民伯伯在辛勤地收谷,秋天的大树落下了好多树叶像翩翩起舞的蝴蝶。夕阳的金辉把绿色的林海染成金黄一片。

华为交换机开启SSH并配置网络信息

<Huawei>system-view
[Huawei]aaa
//配置登录用户并赋予权限,如果采用radius认证,则不用在aaa配置ssh用户
[Huawei-aaa]local-user huajiao238 password cipher huajiao238 privilege level 15  
Info: Add a new user.
[Huawei-aaa]local-user huajiao238 service-type ssh  //配置用户服务类型
[Huawei-aaa]quit
[Huawei]stelnet server enable   //开启ssh,思科设备只需要生成秘钥即可自动开启ssh
[Huawei]ssh user huajiao238 authentication-type password   //配置ssh用户认证类型
[Huawei]ssh user huajiao238 service-type stelnet   //配置ssh用户服务类型
//如果你需要使用秘钥认证或者秘钥和密码同时认证,则需要在交换机上生成秘钥
[Huawei]rsa local-key-pair create
The key name will be: Huawei_Host
The range of public key size is (512 ~ 2048). 
NOTES: If the key modulus is greater than 512, 
       it will take a few minutes.
Input the bits in the modulus[default = 512]:512
Generating keys...
...................++++++++++++
...........++++++++++++
.................++++++++
.........................++++++++
//网络配置
[Huawei]interface Vlanif 1
[Huawei-Vlanif1]ip address 192.168.2.1 30    //此处演示,现网请根据实际操作
//配置用户接口认证模式
[Huawei]user-interface vty 0  //我这里只配置只允许一个用户在线,你也可以根据你自己的实际情况配置第二个用户视图
[Huawei-ui-vty0]authentication-mode aaa    //用户接口配置认证模式
[Huawei-ui-vty0]user privilege level 15    //配置用户接口权限等级
[Huawei-ui-vty0]protocol inbound ssh   //配置只允许ssh连接,你也可以放通所有

没有物理交换机的可以使用Ensp代替,绑定虚拟网卡或物理网卡均可。

Python登录交换机

import paramiko
import os
import select
import sys
 
# 建立一个socket
trans = paramiko.Transport(('192.168.2.1', 22))
# 启动一个客户端
trans.start_client()
 
# 如果使用rsa密钥登录的话
'''
default_key_file = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
prikey = paramiko.RSAKey.from_private_key_file(default_key_file)
trans.auth_publickey(username='huajiao238', key=prikey)
'''
# 如果使用用户名和密码登录
trans.auth_password(username='huajiao238', password='huajiao238')
# 打开一个通道
channel = trans.open_session()
# 获取终端
channel.get_pty()
# 激活终端,这样就可以登录到终端了,就和我们用类似于xshell登录系统一样
channel.invoke_shell()
# 下面就可以执行你所有的操作,用select实现
# 对输入终端sys.stdin和 通道进行监控,
# 当用户在终端输入命令后,将命令交给channel通道,这个时候sys.stdin就发生变化,select就可以感知
# channel的发送命令、获取结果过程其实就是一个socket的发送和接受信息的过程
while True:
    readlist, writelist, errlist = select.select([channel, sys.stdin], [], [],1)
    # 如果是用户输入命令了,sys.stdin发生变化
    if sys.stdin in readlist:
        # 获取输入的内容
        input_cmd = sys.stdin.read(1)
        # 将命令发送给服务器
        channel.sendall(input_cmd)
 
    # 交换机返回了结果,channel通道接受到结果,发生变化 select感知到
    if channel in readlist:
        # 获取结果
        result = channel.recv(1024)
        # 断开连接后退出
        if len(result) == 0:
            print("\r\n**** EOF **** \r\n")
            break
        # 输出到屏幕
        sys.stdout.write(result.decode())
        sys.stdout.flush()
 
# 关闭通道
channel.close()
# 关闭链接
trans.close()

按TAB键自动补全代码

import paramiko
import os
import select
import sys
import tty
import termios
 
'''
实现一个xshell登录系统的效果,登录到系统就不断输入命令同时返回结果
支持自动补全,直接调用交换机终端
'''
# 建立一个socket
trans = paramiko.Transport(('192.168.2.1', 22))
# 启动一个客户端
trans.start_client()
 
# 如果使用rsa密钥登录的话
'''
default_key_file = os.path.join(os.environ['HOME'], '.ssh', 'id_rsa')
prikey = paramiko.RSAKey.from_private_key_file(default_key_file)
trans.auth_publickey(username='huajiao238', key=prikey)
'''
# 如果使用用户名和密码登录
trans.auth_password(username='huajiao238', password='huajiao238')
# 打开一个通道
channel = trans.open_session()
# 获取终端
channel.get_pty()
# 激活终端,这样就可以登录到终端了,就和我们用类似于xshell登录系统一样
channel.invoke_shell()
 
# 获取原操作终端属性
oldtty = termios.tcgetattr(sys.stdin)
try:
    # 将现在的操作终端属性设置为交换机上的原生终端属性,可以支持tab补全命令了
    tty.setraw(sys.stdin)
    channel.settimeout(0)
 
    while True:
        readlist, writelist, errlist = select.select([channel, sys.stdin,], [], [])
        # 如果是用户输入命令了,sys.stdin发生变化
        if sys.stdin in readlist:
            # 获取输入的内容,输入一个字符发送1个字符
            input_cmd = sys.stdin.read(1)
            # 将命令发送给服交换机
            channel.sendall(input_cmd)
 
        # 交换机返回了结果,channel通道接受到结果,发生变化 select感知到
        if channel in readlist:
            # 获取结果
            result = channel.recv(1024)
            # 断开连接后退出
            if len(result) == 0:
                print("\r\n**** EOF **** \r\n")
                break
            # 输出到屏幕
            sys.stdout.write(result.decode())
            sys.stdout.flush()
finally:
    # 执行完后将现在的终端属性恢复为原操作终端属性
    termios.tcsetattr(sys.stdin, termios.TCSADRAIN, oldtty)
 
# 关闭通道
channel.close()
# 关闭链接
trans.close()

以上就是Python实现一个类似Xshell登录系统的效果。谁都不傻,总是敷衍,都会渐行渐远;谁也不笨,没被看重,都要越来越淡。更多关于Python实现一个类似Xshell登录系统的效果请关注haodaima.com其它相关文章!

标签: Python Xshell