Python 如何检查Paramiko中的终端状态
tldr 有没有办法检查Paramiko中的shell以查看它是否已完成命令的执行 Long 我们正在尝试自动化AWS上一些相当普通的服务器任务。我们在Paramiko和boto3方面取得了良好的进展,但在建设我们的基础AMI方面遇到了一些障碍 以下内容为我们提供了一个交互式shell: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
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中完成