【问题标题】:get ip address using os.system in python在 python 中使用 os.system 获取 ip 地址
【发布时间】:2022-11-26 15:32:59
【问题描述】:

我是 python 的新手,我正在尝试使用以下方法获取我的网卡的 IP 地址:

import sys
import os



ip_address = os.system('/sbin/ifconfig ens33 | grep "inet" |awk '/inet / { print $2 }' | cut -d":" -f2')

但是它返回以下错误:

ip_address = os.system('/sbin/ifconfig ens33 | grep "inet" |awk '/inet / { print $2 }' | cut -d":" -f2')
                                                                                 ^

语法错误:语法无效

如果我只是在这里,它会得到一些输出:

ip_address = os.system('/sbin/ifconfig ens33 | grep "inet" ')

inet 192.168.130.130 网络掩码 255.255.255.0 广播 192.168.130.255 inet6 fe80::97b9:2816:c3a3:e02e prefixlen 64 scopeid 0x20

有没有办法使用 os 和 sys 来做到这一点?

【问题讨论】:

  • 您的内部单引号需要转义。
  • 即使您修复了语法错误,这也不会起作用...os.system() 不会返回命令的输出。您将要查看 subprocess 模块。
  • 如果您不想担心内部引号的正确转义,请将整个命令行括在一对三引号 """ 之间。但是,为什么需要通过grepawk提供ifconfig的结果?你可以用 Python 处理它......
  • 谢谢克劳斯,我现在把它改成: ip_address = os.system('/sbin/ifconfig ens33 | grep "inet" |awk \'/inet / { print $2 }\' | cut -d":" -f2' ) 打印出来:192.168.130.130 0 我如何让它不打印“0”
  • “有没有办法使用 os 和 sys 来做到这一点?”你不应该使用os.sytem,使用subprocess模块

标签: python python-3.x os.system


【解决方案1】:

这是一种方法:

import subprocess

cmd = """/sbin/ifconfig eth0 | grep "inet" | awk '/inet / { print $2 }' | cut -d: -f2"""
r = subprocess.run(cmd, shell=True, capture_output=True, universal_newlines=True)
private_ip = r.stdout.strip()

>>> obfuscate_ip(private_ip)  # see footnote
'55.3.93.202'

(对于您的情况:使用ens33 而不是eth0)。

也就是说,您最好使用socket

import socket

def get_private_ip():
    with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as st:
        st.settimeout(0.0)
        try:
            st.connect(('8.8.8.8', 80))
            ip = st.getsockname()[0]
        except socket.error:
            ip = '127.0.0.1'
    return ip

private_ip2 = get_private_ip()

>>> obfuscate_ip(private_ip2)
'55.3.93.202'

和:

assert private_ip2 == private_ip

脚注:我不想透露我的实际 IP 地址(即使只是私人地址)。因此:

import numpy as np
import contextlib

@contextlib.contextmanager
def seed_context(seed):
    state = np.random.get_state()
    np.random.seed(seed)
    try:
        yield
    finally:
        np.random.set_state(state)

def obfuscate_ip(ip):
    with seed_context(id(obfuscate_ip) >> 16):
        mul = np.random.randint(1, 255, 4)
        off = np.random.randint(1, 255, 4)
        parts = (np.array([int(x) for x in ip.split('.')]) * mul + off) % 256
        return '.'.join(map(str, parts))

【讨论】:

  • 你应该只使用subprocess.run()
猜你喜欢
  • 2017-10-05
  • 2016-11-06
  • 1970-01-01
  • 2015-09-26
  • 2011-05-12
  • 1970-01-01
  • 2021-10-06
  • 2015-02-23
  • 2021-01-28
相关资源
最近更新 更多