当前位置:   article > 正文

【Shell实战案例面试题】输入网卡的名字,来输出网卡的IP

【Shell实战案例面试题】输入网卡的名字,来输出网卡的IP

1.问题

  • 参数后判断要加""

  • 名字为空时显示ip

2.分析

  • 把本机的所有网卡名列出来,来引导用户输入

  • 使用命令列出所有网卡信:ifconfig/ip a

  • 设计一个函数,把网卡名作为参数,函数返回网卡的IP

  • 在获取某个网卡IP时,考虑网卡有多个IP地址(或为空IP的网卡)

3.实现

①添加网卡

②查看结果

③配置IP地址

  1. [root@openEuler1 ~]# nmcli connection modify ens160 +ipv4.addresses 1.1.1.1/24
  2. [root@openEuler1 ~]# nmcli connection modify ens160 +ipv4.addresses 2.1.1.1/24
  3. [root@openEuler1 ~]# nmcli connection up ens160
  4. Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
  5. [root@openEuler1 ~]# nmcli connection show
  6. NAME UUID TYPE DEVICE
  7. ens160 cf671928-9983-4a0f-8cf9-10ff6ddedb19 ethernet ens160
  8. [root@openEuler1 ~]# nmcli connection add type ethernet con-name ens224 ifname ens224 Connection 'ens224' (c11362f7-baa3-48be-98e4-d3e3e9d7b13a) successfully added.
  9. [root@openEuler1 ~]# nmcli connection modify ens224 ipv4.addresses 10.10.10.10/24
  10. [root@openEuler1 ~]# nmcli connection up ens224
  11. Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)

④取网卡名、IP地址代码

  1. #方法一
  2. [root@openEuler1 ~]# ip a | awk -F"[: ]" '/[0-9]+:/ {print $3}' | grep -v "^$"
  3. lo
  4. ens160
  5. ens224
  6. ens256
  7. #方法二
  8. [root@openEuler1 ~]# ifconfig | awk -F":" '/^[a-z]+/ {print$1}'
  9. ens160
  10. ens224
  11. ens256
  12. lo
  13. [root@openEuler1 ~]# ip address show ens160 | tr -s " " | awk -F"[ /]" '/inet / {print $3}'
  14. 192.168.126.140
  15. 1.1.1.1
  16. 2.1.1.1

 ⑤实现脚本代码

  1. [root@openEuler1 ~]# vim ms1.sh
  2. #!/bin/bash
  3. ip a | awk -F"[: ]" '/^[0-9]+:/ {print $3}' > interface.txt
  4. get_ip()
  5. {
  6. if [ -n "$interface" ]
  7. then
  8. if grep -qw $interface interface.txt
  9. then
  10. ip a s $interface | tr -s " " | awk -F"[ /]" '/inet / {print $3}'
  11. break
  12. else
  13. echo "输入接口名错误"
  14. continue
  15. fi
  16. else
  17. echo "输入不能为空"
  18. continue
  19. fi
  20. }
  21. while true
  22. do
  23. read -p "请输入网络接口名:" interface
  24. get_ip
  25. done
  26. rm-rf interface.txt
  27. [root@openEuler1 ~]# chmod a+x ms1.sh
  28. [root@openEuler1 ~]# ./ms1.sh

⑥结果

 注意:这个脚本会报break和continue的错,但并没有影响结果

4.改进代码

①代码

  1. [root@openEuler1 ~]# vim ms1.sh
  2. #!/bin/bash
  3. # 获取所有网络接口名称并显示给用户
  4. get_interfaces() {
  5. echo "请选择以下网络接口之一以获取其 IP 地址:"
  6. ip link show | awk -F: '/^[0-9]+: / {print $2}' | tr -d ' '
  7. }
  8. # 根据网络接口名称获取 IP 地址
  9. get_ip_for_interface() {
  10. local interface=$1
  11. # 使用 ip 命令而不是 ifconfig,因为 ifconfig 在某些新系统上可能已被弃用
  12. ip a s $interface | tr -s " " | awk -F"[ /]" '/inet / {print $3}'
  13. }
  14. # 主程序
  15. main() {
  16. local interface
  17. # 调用函数显示所有网络接口
  18. get_interfaces
  19. # 循环直到用户输入有效的网络接口名称或选择退出
  20. while true; do
  21. # 读取用户输入
  22. read -p "请输入网络接口名或输入 exit 退出: " interface
  23. # 退出条件
  24. if [ "$interface" == "exit" ]; then
  25. break
  26. fi
  27. # 检查输入是否为空
  28. if [ -z "$interface" ]; then
  29. echo "输入不能为空,请重新输入。"
  30. continue
  31. fi
  32. # 调用函数获取并显示 IP 地址
  33. ips=$(get_ip_for_interface "$interface")
  34. if [ -z "$ips" ]; then
  35. echo "网络接口 $interface 没有找到 IP 地址。"
  36. else
  37. echo "网络接口 $interface 的 IP 地址是:"
  38. echo "$ips"
  39. fi
  40. done
  41. }
  42. # 执行主程序
  43. main

②结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/50347
推荐阅读
相关标签
  

闽ICP备14008679号