Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.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 如何检查Paramiko中的终端状态_Python_Shell_Ssh_Paramiko - Fatal编程技术网

Python 如何检查Paramiko中的终端状态

Python 如何检查Paramiko中的终端状态,python,shell,ssh,paramiko,Python,Shell,Ssh,Paramiko,tldr 有没有办法检查Paramiko中的shell以查看它是否已完成命令的执行 Long 我们正在尝试自动化AWS上一些相当普通的服务器任务。我们在Paramiko和boto3方面取得了良好的进展,但在建设我们的基础AMI方面遇到了一些障碍 以下内容为我们提供了一个交互式shell: def create_ssh_channel(instance, keypair): # we need to convert the string into a file-like object

tldr

有没有办法检查Paramiko中的shell以查看它是否已完成命令的执行

Long

我们正在尝试自动化AWS上一些相当普通的服务器任务。我们在Paramiko和boto3方面取得了良好的进展,但在建设我们的基础AMI方面遇到了一些障碍

以下内容为我们提供了一个交互式shell:

def create_ssh_channel(instance, keypair):
    # we need to convert the string into a file-like object
    rsa_key = paramiko.RSAKey.from_private_key(io.StringIO(keypair.key_material.decode()))

    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname=instance.public_dns_name, username='ubuntu', pkey=rsa_key, )

    channel = ssh.invoke_shell()

    return channel
然后,我们可以向其发出有用的命令:

channel.send('sudo apt-get update')
channel.send('\n')
并从流中读取:

stream_data = str()
while True:
    if channel.recv_ready():
        stream_data += channel.recv(9999)
    else:
        break
这让我们能够相当可靠地完成大多数事情,包括获取外部资源、将日志输出到其他服务等。我们遇到的问题是,我们需要运行顺序命令,这依赖于完成的第一个命令。例如,我们需要
sudo-apt-get-install-python-pip
,然后是
pip-install-lxml

问题是,虽然大多数命令都会定期更新shell以供读取,但并非所有命令都会这样做。我们已经尝试了几种方法来解决这个问题,包括使用以下
if stream_data.endswith(“:~$”)
打破循环,但这充其量只是偶然的

是否有可靠的方法来检查最后执行的命令是否已在Paramiko shell中完成