python-3.x - urllib.error.URLError : <urlopen error [Errno 113] No route to host>

标签 python-3.x linux centos7

我正在尝试创建一个主代理脚本,其中主脚本从代理那里获取信息。信息如:

  • 主机名使用
  • CPU 使用率
  • 磁盘使用情况
  • 内存使用情况

我已将其放入返回数据的函数中。当数据即将发送时,我收到错误:

Traceback (most recent call last):
  File "./agent.py", line 42, in <module>
    send_data(out_data)
  File "./agent.py", line 36, in send_data
    with urllib.request.urlopen(req) as response :
  File "/usr/lib64/python3.6/urllib/request.py", line 223, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib64/python3.6/urllib/request.py", line 526, in open
    response = self._open(req, data)
  File "/usr/lib64/python3.6/urllib/request.py", line 544, in _open
    '_open', req)
  File "/usr/lib64/python3.6/urllib/request.py", line 504, in _call_chain
    result = func(*args)
  File "/usr/lib64/python3.6/urllib/request.py", line 1346, in http_open
    return self.do_open(http.client.HTTPConnection, req)
  File "/usr/lib64/python3.6/urllib/request.py", line 1320, in do_open
    raise URLError(err)
urllib.error.URLError: <urlopen error [Errno 113] No route to host>

我检查了两个虚拟机之间是否存在连接。一个的 IP 地址 = 192.168.234.2(主),其他 192.168.234.10(代理)。代理的路由表显示 routing table agent这是两者之间的 ping ping

代理.py

#!/bin/python3
##importeer onderstaande modules om deze te gebruiken##
import psutil
import socket
import time
import urllib.parse
import urllib.request

url = 'http://192.168.234.2/cgi-bin/master.py'
##de output van bovenstaande prints word geplaats in deze variabel om deze in onderstaande variabelen door te sturen##


#De dictionairys worden klaar gezet om gebruikt te worden
def save_data():
    return {
        'machine'   : socket.gethostname(),
        'memory'    : psutil.virtual_memory()[2],
        'disk'      : psutil.disk_usage('/').percent,
        'cpu'       : psutil.cpu_percent()
    }

#De data wordt in de dictionairys gezet
def print_info(out_data):
    print ("Het script heeft gedraaid op: ",time.strftime('%m/%d/%Y %H:%M:%S'))
    print ('De naam van deze host machine is:', out_data['machine'])
    print ('Het geheugen is ', out_data['memory'],'% in gebruik')
    print ('De schijf is ', out_data['disk'],'% vol')
    print ('Het CPU percentage dat in gebruik is: ', out_data['cpu'])

#de data wordt naar de master verzonden
def send_data(out_data):
    data = urllib.parse.urlencode(out_data)
    data = data.encode('ascii')
    req = urllib.request.Request(url, data)
    with urllib.request.urlopen(req) as response :
        the_page = response.read()


out_data = save_data()        
print_info(out_data)
send_data(out_data)

大师.py

#!/usr/bin/python3
###importeren van modules om deze vervolgens te kunnen gebruiken in het script###
import cgi, cgitb
import matplotlib.pyplot as plt
import io
import sqlite3

#maak een instance van een field storage
cgitb.enable()
form = cgi.FieldStorage()

#het verkrijgen van data van de velden die vanuit de agent worden opgestuurd.
def get_data():
    system_data = {
    "machine" : form.getvalue('machine'),
    "cpu": form.getvalue('cpu'),
    "mem": form.getvalue('mem'),
    "disk": form.getvalue('disk')}
    return system_data

#print ("Content-type:text/html\n\n")

current_data = get_data()

con = sqlite3.connect('toets_school.db')
cursor = con.cursor()
cursor.execute("CREATE TABLE if NOT EXISTS gegevens ('machine',VARCHAR, 'cpu' float, 'mem' float, 'disk' float)")
cursor.execute("INSERT INTO gegevens (machine, cpu, mem, disk) VALUES ('"+str(current_data["machine"])+"','"+str(current_data["cpu"])+"', '"+str(current_data["mem"])+"', '"+str(current_data["disk"])+"')")
cursor.execute("SELECT cpu, mem, disk FROM gegevens WHERE machine = '"+str(current_data["machine"]+"'")
data = cursor.fetchall()

cpulijst = []
memlijst = []
disklijst = []

for info in data:
    cpulijst.append(info[0])
    memlijst.append(info[1])
    disklijst.append(info[2])

#print(data)
con.commit()
get_data()

print (cpulijst)
def chart_cpu():
    plt.plot(cpulijst)
    plt.title("CPU gebruik")
    plt.xlabel('minuten')
    plt.ylabel('percentage(%)')
    plt.grid(True)
    plt.savefig("cpu.png")
    plt.show()

def chart_memory():
    plt.plot(memlijst)
    plt.title("Geheugen")
    plt.xlabel('minuten')
    plt.ylabel('percentage (%)')
    plt.grid(True)
    plt.savefig("memory.png")
    plt.show()

def chart_disk_usage():
    plt.plot(disklijst)
    plt.title("Schuifruimte")
    plt.xlabel('minuten')
    plt.ylabel('(%)in gebruik')
    plt.grid(True)
    plt.savefig("disk_usage.png")
    plt.show()

chart_cpu()
chart_disk_usage()
chart_memory()

print ("Content-type:text/html\n\n")
print ("<center>")
print ('De naam van deze machine is :', machine)
print ("<br>")
print ("<html><head><title>Website HAF sportschool</title></head><body>")
print("<img src='data:image/png;base64,"+str(base64.b64encode(buf.getvalue()).decode('ascii'))+"' />")
print("<img src='data:image/png;base64,"+str(base64.b64encode(buf2.getvalue()).decode('ascii'))+"' />")
print ("</body></html>")


conn.close()

我希望代理发送的信息存储在函数 save_data 中,并传递给 out_data。并且数据在函数 def send_data 中发送到主机。

编辑:在 Bill Huneke 的赞扬之后,非常感谢。第一个问题解决了。使用 Linux 命令:

sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload

我能够 curl master.py。现在我的问题是 master 上的数据库只填充了“无”。

有人知道如何解决这个问题吗?

最佳答案

您可能希望首先尝试从 Python 外部获取该 URL 来解决此问题。

所以,运行'curl http://192.168.234.2/cgi-bin/master.py ' 看看你得到了什么。您可能在 .2 上错误配置了 Web 服务器,或者可能有防火墙规则或其他一些阻止与 Web 服务器通信的规则。

编辑:澄清 - “无路由到主机”错误不一定表示 路由 是问题所在。误导,我知道。它还可能表明特定端口(在本例中为 http,80)不可访问/未响应。 Ping 是一个很好的步骤,但不能完全诊断这一点。

更新(问题更改后):

很高兴听到您解决了您最初询问的“无路由到主机”错误。

我了解到您现在发现了更多问题。通读你的其余脚本,我会说你有许多不寻常的元素,在我看来它们不会起作用。我建议您逐步构建系统。从你的脚本中取出所有东西,只放入一件事,让它完美地工作。从那里开始迭代:将您的工作放在源代码管理(例如 Git)中,这样您就可以在进行时返回它。继续添加功能,向数据库添加更多字段等。慢慢来,逐步构建。边走边问个别问题。

首先处理一个只有一个值和一个字段的非常基本的数据库插入。如果事情不起作用,请使用其他工具(就像您使用 curl 所做的那样)来确认交互组件确实在表达您认为它们在表达的内容。例如,您应该查看发送到您的服务器的内容,以确认发送的表单数据确实格式正确并且正是您的主机试图解析的内容。

此外,您尝试构建的系统非常适合 Django 或 Flask 等框架。将您的项目置于其中之一将提供引导(最终)成功的导轨。

祝你好运

关于python-3.x - urllib.error.URLError : <urlopen error [Errno 113] No route to host>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58732591/

相关文章:

python - python subprocess 模块的动态输出

python - 如何使用sox重新采样和正确连接wav文件?

python-3.x - 在将 Keras Tuner 与 Tensorflow 2 结合使用时,出现错误 : division by zero

linux - 如何知道 Socket 客户端断开连接?

linux - 如何在Linux中一次复制多个文件?这些文件的源位置和目标位置位于同一目录

linux - 在 CentOS 7 上更改 MongoDB 的默认 dbPath 时出错

Tomcat7没有写权限

python - 如何将 DateTime 对象与整数进行比较?

linux - 从进程内部转储 Linux 核心文件的好方法是什么?

php - 无法打开流或文件 : failed to open stream: Permission denied