【问题标题】:Get only the IP address using Bash inside Python在 Python 中使用 Bash 仅获取 IP 地址
【发布时间】:2017-10-05 07:27:17
【问题描述】:

我正在编写一个小 Python 脚本(Python 2.7.13)来进行 ARP 扫描。 问题是我对Shell Scripting还不太了解...... 我在 Kali Linux 上运行,这是我目前使用的:

import subprocess
interface = "wlan0"
ip = subprocess.check_output("ifconfig " + interface + " | grep 'inet'| cut -d':' -f2", shell = True).strip()    

通过这样做,我仍然将其作为 ip:

'inet 192.168.0.43  netmask 255.255.255.0  broadcast 192.168.0.255\n14c\n14c'

我需要在我的 ip 分配中添加什么才能将192.168.0.43 作为我的 ip 变量? 我已经在网上查过了,但我在 Linux 上找不到解决方案…… 我只在 Mac OS X (Parse ifconfig to get only my IP address using Bash) 上找到了非常好的解决方案,但我希望这个代码首先在我的 Kali Linux 安装上运行,然后我可以稍后将它移植到 Mac OS X 我也已经尝试过使用这个答案(Finding local IP addresses using Python's stdlib),但我正在寻找一种方法来操纵 ifconfig 的结果,只需使用 cut 或 awk...

【问题讨论】:

  • @jordanm 谢谢,但这不是我想要的......但是按照其他帖子所说的,我只会得到'127.0.1.1'......
  • ip.split()[1]
  • 谢谢@t.m.adam !!这个简单的解决方案效果很好!我实际上只是在考虑使用 split(),但我认为使用 shell 脚本会有一个更简单的解决方案。但是您的回答确实可以完成工作!
  • 不客气。您根本不需要使用 bash 命令,您可以在 python 中完成所有操作,我会发布答案,但我当时在 Windows 上。另外,我认为ifconfig 将替换为ip,您可能想要使用它

标签: python linux bash shell


【解决方案1】:

或者您可以使用以下命令获取 IP 地址:

ip = subprocess.check_output("ifconfig " + interface + " | awk '/inet / {print $2}', shell=True)

这里还有一些其他的答案。 how-can-i-get-the-ip-address-of-eth0-in-python

【讨论】:

  • 从 Python 内部运行 awk 是完全古怪的。
  • 是的,我同意,所以我粘贴了请求的链接。
【解决方案2】:

使用netifaces 库,归结为:

>>> for iface in netifaces.interfaces():
...   for iftype, data in netifaces.ifaddresses(iface).items():
...      if iftype in (netifaces.AF_INET, netifaces.AF_INET6):
...        for info in data:
...           print(info['addr'])
...
127.0.0.1
::1
172.27.127.53
fe80::807a:c726:c91:6269%enp3s0
192.168.1.12
fe80::e69:7e0:4b7:abc2%wlxc4e984122c4e
192.168.0.1
fe80::42:57ff:fef6:3fb2%docker0
192.168.48.1
192.168.32.1
fe80::cb3:17ff:fe80:481e%veth8dd1c5a
fe80::48c:96ff:fea9:e2eb%vethff4fd4a
fe80::5ca8:68ff:feb1:8231%vethc52d992
fe80::406c:40ff:fe2f:4c7e%vethf1c1221

这包括 ipv6 和 ipv4 地址,还处理具有多个地址的接口和具有多个接口的机器。

要仅过滤 ipv4 地址,请将 if 条件更改为:

if iftype in (netifaces.AF_INET,):

【讨论】:

    【解决方案3】:

    错误是cut -d ':' 在冒号上拆分,而不是在空格上。但是使用外部实用程序来解析来自ifconfig 的输出无论如何都是疯狂的。 Python 在本机上做得很好,如果您不熟悉标准的 shell 实用程序(也许即使您熟悉),它可能更快、更容易阅读和理解。

    ifconfig = subprocess.check_output(['ifconfig', interface])  # no shell=True
    for line in ifconfig.split('\n'):
        fields = line.split()
        if fields[0] == 'inet':
            ip = fields[1]  # no need to strip() if you discard the tail
            break
    

    这仍然不是完全可移植的,因为ifconfig 的细节在不同的平台上看起来会有所不同(尽管这个特定的细节可能没问题)并且接口名称在不同的平台上看起来会有所不同。避免 ifconfig 的纯 Python 解决方案可能会更便携。

    在 OSX 上,inet 之前的第一个字符是选项卡,但在 Ubuntu 上不是(所以我猜这也会在 Kali 上保留)。我不得不更改代码以适应。有关可移植性问题的示例,请参阅编辑历史记录。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-19
    • 2022-11-26
    • 2021-08-25
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    相关资源
    最近更新 更多