Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
退出Python中的控制台连接_Python_Console_Exit_Virsh - Fatal编程技术网

退出Python中的控制台连接

退出Python中的控制台连接,python,console,exit,virsh,Python,Console,Exit,Virsh,我正在编写一些python代码,以便登录到包含虚拟应用程序(VTA)的白盒设备。将安装两个不同的VTA,代码将登录到物理设备,然后使用virsh控制台(VTA名称)登录到VTA 我遇到的问题是退出一个VTA,然后将virsh控制台转入另一个VTA。exit命令只是再次将我带到登录提示,但不会退出控制台连接 为了做到这一点,我必须发送一个“control+]”以脱离控制台。我一直在网上搜索,试图找到一个解决方案,但我找到的唯一选择是发送和“退出”,后跟“\x1b”。然而,这实际上并没有脱离控制台窗

我正在编写一些python代码,以便登录到包含虚拟应用程序(VTA)的白盒设备。将安装两个不同的VTA,代码将登录到物理设备,然后使用virsh控制台(VTA名称)登录到VTA

我遇到的问题是退出一个VTA,然后将virsh控制台转入另一个VTA。exit命令只是再次将我带到登录提示,但不会退出控制台连接

为了做到这一点,我必须发送一个“control+]”以脱离控制台。我一直在网上搜索,试图找到一个解决方案,但我找到的唯一选择是发送和“退出”,后跟“\x1b”。然而,这实际上并没有脱离控制台窗口。更确切地说,它结束了我并不期待的课程

有没有办法用python发送“Control+]”

以下是一些显示步骤的代码:

from paramiko import SSHClient, AutoAddPolicy
import time
import re
import os
import sys
import progressbar
import stat

def create_connection(host):
    username = ''
    password = ''
    port = 22
    connection_info = {
        'port': port,
        'username': username,
        'password': password
    }

    client = SSHClient()
    client.set_missing_host_key_policy(AutoAddPolicy())
    client.connect(host, timeout=10, auth_timeout=10, **connection_info)
    ssh_session = client.invoke_shell()
    ssh_session.settimeout(10.0)

    return ssh_session


def send_commands(ssh_session, commands, sleep_time=1):
    for command in commands:
        ssh_session.send(command)
        time.sleep(sleep_time)

    output = ssh_session.recv(1048576)
    decoded_output = output.decode()
    return decoded_output


console_commands = [
        'virsh console vw-vta\n',
        '\n',
        '\n',  # Place the username of the VTA here
        '\n'  # Place the password of the VTA here
    ]
show_mgmt_commands = [
        'ifconfig ens2 | grep Bcast\n'
    ]

exit_console = [
        'exit\n'
        '\x1b'
    ]
validate_commands = [
        'virsh list\n'
    ]


def validation():
    host = input('What is the IP address? ')
    print('\n')
    print(f'\033[1;33m--< Checking {host} for a valid VTA >------------\033[0m')

    try:
        ssh_session = create_connection(host)
    except Exception as l:
        print(f"\033[1;31mCannot connect to {host}!\033[0m")
        return

    validate = send_commands(ssh_session, validate_commands)

    if 'y1564' in validate:
        print(f"\033[1;32mThere is a Y1564 VTA running! Obtaining information...\033[0m")
        ssh_session = create_connection(host)
        console = send_commands(ssh_session, console_commands)

        try:
            show_mgmt = send_commands(ssh_session, show_mgmt_commands, sleep_time=2)

        except Exception as e:
            print(f"\033[1;31mCouldn't reach the console on " f"\033[1;33m{host}\033[0m"f"\033[1;31m. This VTA will need to be rebuilt.\033[0m")



        if 'Login incorrect' in show_mgmt:
            print(f"\033[1;31m--< Begin ERROR MESSAGE >------------\033[0m")
            print(show_mgmt)
            print(f"\033[1;31m--< End ERROR MESSAGE >------------\033[0m")
            print(f"\033[1;31mThis VTA has the incorrect password!\033[0m")
            print(f'{host},VTA Password Error', file=f)
            exit = send_commands(ssh_session, exit_console)
            return
        else:
            try:
                mgmt = show_mgmt.split('addr:')[1].split(" ")[0]
            except Exception as g:
                print(f"\033[1;31mThis VTA is corrupt and will need to be rebuilt!\033[0m")
                exit = send_commands(ssh_session, exit_console)
                return
            print("Y1564 VTA IP: ", mgmt)
            exit = send_commands(ssh_session, exit_console)

    else:
        print("\033[1;33mThere is NOT a Y1564 VTA running on \033[0m"f"\033[1;34m {host}\033[0m")
    
    ssh_session.close()

if __name__ == '__main__':
    full_check()
从paramiko导入SSHClient,自动添加策略
导入时间
进口稀土
导入操作系统
导入系统
导入进度条
进口统计
def创建_连接(主机):
用户名=“”
密码=“”
端口=22
连接信息={
“端口”:端口,
“用户名”:用户名,
“密码”:密码
}
client=SSHClient()
客户端。设置\缺少\主机\密钥\策略(AutoAddPolicy())
client.connect(主机,超时=10,身份验证超时=10,**连接信息)
ssh\u session=client.invoke\u shell()
ssh_session.settimeout(10.0)
返回ssh\u会话
def send_命令(ssh_会话、命令、睡眠时间=1):
对于命令中的命令:
ssh_session.send(命令)
时间。睡眠(睡眠时间)
输出=ssh_session.recv(1048576)
decoded_output=output.decode()
返回解码输出
控制台命令=[
“virsh控制台vw vta\n”,
“\n”,
“\n”,将VTA的用户名放在此处
“\n”#将VTA的密码放在此处
]
显示\u管理\u命令=[
'ifconfig ens2 | grep Bcast\n'
]
退出控制台=[
“退出\n”
“\x1b”
]
验证\u命令=[
'病毒列表\n'
]
def验证():
主机=输入('什么是IP地址?')
打印(“\n”)
打印(f'\033[1;33m-->Checking{host}for a valid VTA>-----------\033[0m')
尝试:
ssh\u会话=创建\u连接(主机)
例外情况除外,如l:
打印(f“\033[1;31M无法连接到{host}!\033[0m”)
返回
验证=发送\u命令(ssh\u会话,验证\u命令)
如果验证中的“y1564”:
打印(f“\033[1;32M此处有一台Y1564 VTA正在运行!正在获取信息…\033[0m”)
ssh\u会话=创建\u连接(主机)
控制台=发送命令(ssh会话、控制台命令)
尝试:
显示管理=发送命令(ssh会话、显示管理命令、睡眠时间=2)
例外情况除外,如e:
打印(f“\033[1;31m无法到达“f”\033[1;33m{host}\033[0m”f“\033[1;31m”上的控制台。此VTA需要重建。\033[0m”)
如果显示管理中的“登录不正确”:
打印(f“\033[1;31m-->Begin ERROR MESSAGE>-->\033[0m”)
打印(显示和管理)
打印(f“\033[1;31m-->End ERROR MESSAGE>-->\033[0m”)
打印(f“\033[1;31M此VTA的密码不正确!\033[0m”)
打印(f{host},VTA密码错误,文件=f)
退出=发送命令(ssh会话、退出控制台)
返回
其他:
尝试:
mgmt=show_mgmt.split('addr:')[1]。split(“”[0]
例外情况除外,如g:
打印(f“\033[1;31M此VTA已损坏,需要重建!\033[0m”)
退出=发送命令(ssh会话、退出控制台)
返回
打印(“Y1564 VTA IP:,管理)
退出=发送命令(ssh会话、退出控制台)
其他:
打印(“\033[1;33m此处没有运行在\033[0m“f”\033[1;34m{host}\033[0m]上的Y1564 VTA”)
ssh_session.close()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
全面检查
当此函数完成时,代码的第二部分调用一个类似的函数。但是它失败了,因为上一个函数没有断开控制台连接。代码试图在下一个函数仍在上一个VTA内时发送下一个函数的命令

下面是一个输出,显示它正在执行的操作:

What is the IP address? 1.1.1.1


--< Checking 1.1.1.1 for a valid VTA >------------
There is a Y1564 VTA running! Obtaining information...
Y1564 VTA IP:  10.10.10.10
exit
logout


--< Checking 1.1.1.1 for a valid VTA >------------
Ubuntu 16.04.6 LTS y1564 ttyS0

y1564 login:

virsh list
Password:
There is NOT a VTA running on 1.1.1.1

什么是IP地址?1.1.1.1
--<检查1.1.1.1是否存在有效的VTA>------------
有一台Y1564 VTA正在运行!正在获取信息。。。
Y1564 VTA IP:10.10.10
出口
注销
--<检查1.1.1.1是否存在有效的VTA>------------
Ubuntu 16.04.6 LTS y1564 ttyS0
y1564登录:
病毒列表
密码:
1.1.1.1上没有运行VTA

上面的输出显示,当运行exit命令并后跟\x1b时,它不会正确退出,但会尝试从下一部分发送“virsh list”命令。

用于发送ctrl+]的十六进制字符错误。请将退出控制台命令更新为:
exit_控制台=['exit\n','\x01D']

ASCII参考:

看起来您正在使用
invoke\u shell()
方法,您可以使用
close()
方法退出该特定shell,并根据需要建立一个新的shell


帕拉米科参考资料:

谢谢!这非常有效