分类 默认分类 下的文章

要获取某个内网IP对应的网卡MAC地址,可以通过以下几种方式,具体方法取决于你所使用的操作系统和网络环境:

1. 使用 arp 命令(适用于大多数操作系统)

ARP(地址解析协议)用于将IP地址映射到物理MAC地址。你可以通过以下步骤获取某个IP地址对应的MAC地址:

Windows系统

  1. 打开命令提示符(CMD)。
  2. 输入以下命令:

    arp -a <IP地址>

    例如:

    arp -a 192.168.1.100
  3. 查找对应IP地址的MAC地址。命令会列出一个IP地址和其对应的MAC地址。

Linux系统 / macOS

  1. 打开终端。
  2. 输入以下命令:

    arp -n <IP地址>

    或者

    arp <IP地址>

    例如:

    arp -n 192.168.1.100
  3. 会显示该IP地址的MAC地址。

2. 使用 ping + arp 方法

如果ARP缓存中没有该IP地址的MAC地址,您可以首先尝试ping该IP地址,然后再查看ARP缓存:

步骤

  1. 在命令行中输入 ping 命令来确保与目标IP地址的连接。
    例如:

    ping 192.168.1.100
  2. 然后查看ARP缓存:

    arp -a

    这时,命令会显示出连接过的设备的IP地址和对应的MAC地址。

3. 通过路由器或交换机获取

如果你有路由器或交换机的管理权限,也可以通过登录到网络设备的管理界面查看设备的MAC地址表。大多数路由器和交换机会列出连接到网络中的设备及其IP与MAC地址对应关系。

4. 使用网络扫描工具

如果你在局域网内,并且没有相应的权限或工具来获取MAC地址,你可以使用一些网络扫描工具来获取该信息。例如:

  • Nmap:一个强大的网络扫描工具,可以扫描整个子网并列出IP和MAC地址。
    使用以下命令:

    nmap -sP 192.168.1.0/24

    这会扫描192.168.1.x网络段,并显示每个活动设备的IP和MAC地址。

  • Wireshark:可以捕获和分析网络上的数据包,能够提取设备的MAC地址。

注意:

  • 获取其他设备的MAC地址通常需要在同一网络段内,并且目标设备的ARP缓存必须已经包含该信息。如果ARP缓存过期或没有更新,可能需要重新发送数据包以刷新缓存。
  • 确保你的操作符合网络安全规定,未经授权扫描其他网络设备可能会违反使用政策。

跨网段使用arp就不行

是的,跨网卡(即不同子网或不同网络接口卡)时直接获取 MAC 地址 是不可行的,原因如下:

1. ARP 协议的限制

  • ARP(地址解析协议)是局域网内的协议,用于将 IP 地址 映射到 MAC 地址,它只在同一子网内有效。当你尝试通过一个网卡查询另一个子网的设备时,ARP 请求无法跨越路由器,因此 ARP 请求 只能在同一网络接口的局域网内工作。

2. 不同子网的网络设备

  • 当设备在不同的子网或通过不同网卡连接时,它们之间的通信需要通过 路由器网关。由于路由器只关心 IP 层(网络层)而不关心 MAC 地址,它会将数据包转发到目标设备所在的子网,然后目标设备再使用 ARP 解析 IP 地址到 MAC 地址。
  • 因此,在一个子网的设备是无法直接访问另一个子网设备的 MAC 地址,因为路由器会丢弃 MAC 地址信息,传递给目标设备的仅是 IP 地址。

3. 跨网卡获取 MAC 地址的方法

如果你需要在跨网卡(不同子网或不同网络接口卡)的情况下获取 MAC 地址,可以考虑以下方法:

  • 使用网络扫描工具

    • Nmap 等扫描工具可以帮助你扫描整个网络段,并获取各设备的 IP 和 MAC 地址。例如,Nmap 可以扫描整个子网,帮助你识别其他子网设备的 MAC 地址(即使它们不在同一局域网内)。

      nmap -sP 192.168.1.0/24

      这条命令会扫描 192.168.1.0/24 网段,列出所有活动设备的 IP 和 MAC 地址。

  • 通过路由器或网关

    • 如果你有路由器或网关的管理权限,通常它会记录已连接设备的 IP 地址MAC 地址,并提供相应的设备管理界面,允许你查看整个网络的 IP 和 MAC 地址映射表
    • 例如,许多家庭路由器和企业级路由器都会在其管理界面中列出已连接设备的 MAC 地址表
  • 使用 Wireshark 等抓包工具

    • 你可以通过 Wireshark 等网络抓包工具,在不同子网内捕获流量。虽然 Wireshark 无法直接获取其他子网设备的 MAC 地址,但它可以捕获来自网关的数据包,并通过分析报文中的 MAC 地址信息,间接获取其他子网的设备信息。

4. 总结

  • 在不同网卡或跨网段的情况下,直接使用 ARP 命令是无法获取设备的 MAC 地址的,因为 ARP 协议仅在同一局域网内有效。
  • 如果你需要跨网卡获取 MAC 地址,通常需要依赖网络扫描工具、路由器的 MAC 地址表或使用抓包工具来间接获得这些信息。

遇到的问题,作个笔记!

bootstrap model 关闭的时候控制台提示报错信息:

 Blocked aria-hidden on an element because its descendant retained focus. The focus must not be hidden from assistive technology users. Avoid using aria-hidden on a focused element or its ancestor. Consider using the inert attribute instead, which will also prevent focus.

是 aria-hidden 的属性产生的:

查看页面代码 model 模态框 把 aria-hidden=true 加到了 .modal 这个节点上了,将这个属性去掉就解决了

关于 aria-hidden 属性的详解:
aria-hidden 是一个与可访问性(accessibility)相关的 HTML 属性,它用于告知屏幕阅读器和其他辅助技术是否应该忽略某个元素,从而不将该元素呈现给使用这些技术的用户。

ARIA(Accessible Rich Internet Applications)

ARIA 是一组专门用于提高 Web 内容可访问性的属性,尤其针对使用屏幕阅读器等辅助工具的用户。aria-hidden 是其中一个属性,它与语义 HTML 标签的作用不同,而是帮助向辅助技术表明某些元素是否对残障人士可见或可访问。

aria-hidden 的作用

  • aria-hidden="true":该属性的值为 true 时,表示该元素和它的所有子元素会被屏幕阅读器忽略。这样,这些元素将不被读取或呈现给使用屏幕阅读器的用户。即使元素的样式使其可见,屏幕阅读器也不会将其读取。
  • aria-hidden="false":这个值表示该元素对屏幕阅读器是可见的,允许它作为正常内容被屏幕阅读器读取。如果没有显式设置 aria-hidden,默认情况下元素对屏幕阅读器是可访问的。

应用场景

  1. 隐藏装饰性元素

    • 你可能希望屏幕阅读器忽略一些纯粹用于装饰或视觉效果的元素(例如图标、背景图片等),因为这些元素并不为内容提供有意义的信息。
    • 例如,假设你有一个图标元素,它只用于视觉展示,而不包含任何有用信息,可以设置 aria-hidden="true" 来让屏幕阅读器忽略它。
    <div aria-hidden="true">
      <i class="icon">xxxxxx</i>  <!-- 这是装饰性图标,屏幕阅读器会忽略它 -->
    </div>
  2. 隐藏不必要的内容

    • 有时你可能希望动态地隐藏一些内容,这些内容可能不适合当前的用户(例如,某些信息只适用于特定条件下的用户)。可以使用 aria-hidden 来隐藏这些内容。
    <div aria-hidden="true">
      <p>这个内容在当前情况下对屏幕阅读器用户不可见。</p>
    </div>
  3. 动态控制可见性

    • aria-hidden 还可以用于动态控制元素的可访问性。例如,当某个弹出窗口(如模态框)被打开时,可以使用 aria-hidden="true" 来隐藏背景内容,从而让用户集中注意力在弹出窗口上。
    <div aria-hidden="true">这是被隐藏的背景内容,屏幕阅读器不会读取它。</div>
    <div>这是可见的前景内容,屏幕阅读器将读取它。</div>
  4. 改善用户体验

    • aria-hidden 可以帮助优化用户体验,尤其是在设计复杂的用户界面时。通过正确使用它,可以减少不必要的干扰,使用户能够专注于他们需要关注的内容。

注意事项

  • 影响范围aria-hidden="true" 不仅会影响当前元素,还会递归地影响该元素的所有子元素。如果父元素被设置为 aria-hidden="true",它的所有子元素都会被屏幕阅读器忽略。

    <div aria-hidden="true">
      <p>这个段落和其内部的所有内容都会被屏幕阅读器忽略。</p>
    </div>
  • 使用时机aria-hidden 应该小心使用。误用可能导致有意义的内容被错误地隐藏,影响用户的访问体验。最好只在元素确实是纯粹装饰性,或在某些条件下不需要被读取时使用。
  • 对可视化的影响aria-hidden 仅影响屏幕阅读器和其他辅助技术的行为,它不会改变元素的可视化显示。即使一个元素被设置为 aria-hidden="true",它仍然会在屏幕上显示。要完全隐藏该元素,可以使用 CSS 设置 display: nonevisibility: hidden

总结

  • aria-hidden="true":使元素和其子元素对屏幕阅读器隐藏,忽略该元素。
  • aria-hidden="false":明确表示该元素对屏幕阅读器可见(如果没有显式设置,则默认为 false)。
  • aria-hidden 是帮助提高网页可访问性的重要工具,特别是在有复杂界面时。
  • 使用时要小心,确保不会误隐藏那些有意义的内容,从而影响用户体验。

示例:
# 如果 url 含有 . , 并且 不以 do 或 action 结尾,则匹配成功。

location ~ .*\.(?!(do|action)$) {
        root /demo/code/webroot;
    }
^~    标识符匹配后面跟-一个字符串。匹配字符串后将停止对后续的正则表达式进行匹配,如location ^~ /images/ , 在匹配了/images/这个字符串后就停止对后续的正则匹配
=   精准匹配,如location=/,只会匹配url为/的请求。
~   区分大小写的匹配。
~*    不区分大小写的匹配。
!~     对区分大小写的匹配取非。
!~*    对不区分大小写的匹配取非。
/     通用匹配,如果没有其它匹配,任何请求都会被匹配到

匹配顺序优先级:

(location =)> (location 完整路径)> (location ^~ 路径) > (location ~,~*正则顺序) >(location 部分起始位置) > (/)

2、正则表达式

*:重复前面的字符0次或多次
?:重复前面的字符0次或1次
+:重复前面的字符1次或多次
.:匹配除换行符以外的任意一个字符
(a|b):匹配a或b
^:以...开头
$:以...结尾
{n}:重复前面的字符n次
{n,}:重复前面的字符n次或更多次
{n,m}:重复前面的字符n-m次
*?:重复前面的字符0次或多次,但尽可能少重复
+?:重复前面的字符1次或多次,但尽可能少重复
??:重复前面的字符0次或1次,但尽可能少重复
{n,m}?:重复前面的字符n-m次,但尽可能少重复
{n}?:重复前面的字符n次以上,但尽可能少重复

3、正则表达式补充

\W:匹配任意不是字母,数字,下划线,汉字的字符(特殊符号)
\S:匹配任意不是空白符的字符
\D:匹配任意非数字的字符
\B:匹配任意不是单词开头或结尾的位置
[a]:匹配单个字符a
[a-z]:匹配a-z小写字符的任意一个
[^a]:匹配除了a以外的任意字符
[^abc]:匹配除了abc这几个字母以外的任意字符

要在一串数字中使用正则匹配一个11位的电话号码?要求数字是11位,且后面不能再有继续的数字,这个正则应该怎么写?

如果你希望 11位的电话号码 后面紧跟着可以跟其他字符(但不能是数字),可以调整正则表达式,确保电话号码后面没有数字。可以使用类似下面的正则:

/^\d{11}(?!\d).*$/

解释:

  • ^:表示字符串的开始。
  • \d{11}:表示精确匹配 11 位数字。
  • (?!\d):这是一个 负向前瞻(negative lookahead)。它的意思是:如果后面跟着数字,匹配会失败。确保在 11 位数字之后不会有数字。
  • .*:表示后面可以跟任意字符(除了换行符),但不会包括数字。
  • $:表示字符串的结束。

使用示例:

$pattern = '/^\d{11}(?!\d).*$/';
$phone_number = '13812345678abc';  // 示例电话

if (preg_match($pattern, $phone_number)) {
    echo "电话号码匹配成功!";
} else {
    echo "电话号码无效!";
}

说明:

  • 这个正则表达式会匹配 恰好 11 位数字,并且在 11 位数字之后,可以跟任意字符,但不能跟数字
  • 如果后面是数字,它就不会匹配。

举例:

  • 有效: 13812345678abc13812345678xyz12313812345678#@!
  • 无效: 13812345678123abc123(后面跟着数字),1381234567(不足 11 位)

在 JavaScript 中,?. 是一种可选链操作符(Optional chaining operator),它可以简化访问可能为null或undefined的属性或方法的代码书写,避免因为对象链中某个属性或方法不存在而导致的错误。?. 的使用方式如下:

1. 访问属性

// 普通访问方式
const name = user.profile.name; // 如果 user 或 profile 为 null 或 undefined,将会导致错误

// 使用可选链操作符
const name = user?.profile?.name; // 如果 user 或 profile 为 null 或 undefined,name 将会取到 undefined

2. 调用方法

// 普通调用方法方式
const result = app.getData(); // 如果 app 为 null 或 undefined,将会导致错误

// 使用可选链操作符
const result = app?.getData(); // 如果 app 为 null 或 undefined,result 将会取到 undefined

3. 数组访问

const arr = [1, 2, 3];
const value = arr?.[0]; // 如果 arr 为 null 或 undefined,value 将会取到 undefined

4. 函数调用

function sayHello() {
  console.log('Hello, world!')
}

const func = sayHello?.(); // 如果 sayHello 为 null 或 undefined,调用将会被忽略

可选链操作符 ?. 使得我们可以更加安全和简洁地访问对象的属性和方法,避免代码中大量的空值检查,提高代码的可读性和健壮性。需要注意的是,?. 操作符在一些较老版本的 JavaScript 环境可能不被支持,因此在使用时需要注意环境的兼容性。

兼容性情况

可选链操作符 ?. 在 JavaScript 中的兼容性随着不同 JavaScript 引擎和浏览器的更新而有所变化。以下是可选链操作符的兼容性情况:

1. Node.js

  • 可选链操作符从 Node.js 14 版本开始得到支持,但需要在 JavaScript 文件中指定 ECMASCript版本 支持。
  • 可以通过在项目中的 .eslintrc 文件中设置 ecmaVersion: 2020 来指定支持 ECMAScript 2020。

2. 现代浏览器

  • Chrome、Firefox、Edge 等现代浏览器在较新的版本中已经支持可选链操作符。
  • 可以在 Can I Use 网站上查看各个浏览器对可选链操作符的支持情况。

3. Babel 转译

  • 如果项目需要兼容性,可以使用 Babel 将项目中的可选链操作符转译为普通的 JavaScript 代码,以确保在旧版 JavaScript 引擎中的兼容性。
  • 可以在 Babel 的官方文档中找到相关的插件和配置信息。

4. Polyfill

  • 也可以使用相应的 Polyfill 库来实现可选链操作符在旧版 JavaScript 环境下的同等效果。
  • 一些流行的 JavaScript Polyfill 库(如 core-js)提供了可选链操作符的支持。

总的来说,随着 JavaScript 标准的不断发展和现代浏览器的更新,可选链操作符在很多环境中都得到了良好的支持。但在项目中应根据实际情况考虑目标用户群体的环境兼容性,选择合适的方案来处理可选链操作符的兼容性问题。