第一次在这里提问。
因此,我的任务是创建一个脚本来检查设备是否可以通过 ping 访问。只是想指出,我能够在我的笔记本电脑上创建一个工作脚本,并且能够获得我们想要的输出。我的笔记本电脑运行 Python 3.11.4。
现在,我们需要在脚本服务器中运行所有脚本(根据公司政策要求)。我们有一个专用的脚本服务器。我们主要在 Linux 脚本服务器中运行网络自动化。它使用python 3.7.5。
问题是,当我在 Linux 脚本服务器中运行相同的脚本时,它会挂起。没有回声或任何东西。需要按“CTRL+C”来停止它。当我这样做时,它将返回以下信息:
**^CTraceback (most recent call last):
File "ping_nodes.py", line 28, in <module>
shell=False)
File "/usr/lib/python3.7/subprocess.py", line 490, in run
stdout, stderr = process.communicate(input, timeout=timeout)
File "/usr/lib/python3.7/subprocess.py", line 951, in communicate
stdout = self.stdout.read()**
逐行隔离后,实际挂起的部分是 subprocess.run 部分,如下所示,其中 IP 是包含我们的 IP 地址的变量。我尝试只使用一个 IP 地址,但行为仍然相同。
pingcheck = subprocess.run(["ping", "-n", "5", ip], stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
当我添加“Shell=True”时,它实际上并没有挂起,但结果与我们想要看到的不同。
这与不同的 python 版本有关吗?如果我们这里有人有想法,我愿意接受任何事情。
谢谢! -新手程序员
尝试添加 timeout=50 参数,但仅显示错误“Command '['ping', '-n', '5', '8.8.4.4']' 50 秒后超时”。但是当我在笔记本电脑上运行它时,无论有没有超时参数,它都运行得非常完美。
隔离脚本中挂起的部分位于 subprocess.run 部分。没有回声,需要键盘中断来停止。
尝试添加 Shell=True,she 脚本没有挂起。诡异的... 但如果 Shell 设置为 true,我们解析的结果会有所不同。我们更喜欢它而不是 False。
据我了解您的问题,您想要实现的只是确定是否可以 ping 通给定的主机。如果是这样的话:
from subprocess import run, DEVNULL, CalledProcessError
def can_ping(host):
args = [
"ping",
"-c",
"1",
host
]
try:
run(args, stdout=DEVNULL, stderr=DEVNULL, check=True)
except CalledProcessError:
return False
return True
print(can_ping("www.nonsense.corp"))
print(can_ping("www.google.com"))
输出:
False
True
注:
您可能想添加超时