如何从远程SSH登录确定子网掩码和网络接口卡?

时间:2015-05-14 20:41:06

标签: linux shell ssh network-programming aix

在另一个问题(下面的链接)中,建议我从远程SSH登录中获取网络接口卡号和子网掩码,而不是提示用户输入。我所拥有的只是我的远程主机的IP地址。我需要获取子网掩码以确定远程和本地主机是否在同一子网上,以及用于设置和配置虚拟IP以进行别名的接口卡号。

有人可以建议我如何解析必要的信息并将其返回到启动远程ssh连接的shell脚本中吗?我的目标主机使用Linux或AIX作为操作系统。我熟悉netstat函数,但我不确定从中解析信息是否有效,或者是否有更好的方法来获得我需要的对Linux和AIX操作系统都有效的方法。

感谢您提供的任何帮助!

How to return from shell 'read' command passed in expect script?

- UPDATE -

AIX ifconfig -a:

$ ifconfig -a
en0: flags=1e080863,480<UP,BROADCAST,NOTRAILERS,RUNNING,SIMPLEX,MULTICAST,GROUPR
T,64BIT,CHECKSUM_OFFLOAD(ACTIVE),CHAIN>
        inet 10.105.65.131 netmask 0xffff0000 broadcast 10.105.255.255
         tcp_sendspace 262144 tcp_recvspace 262144 rfc1323 1
lo0: flags=e08084b,c0<UP,BROADCAST,LOOPBACK,RUNNING,SIMPLEX,MULTICAST,GROUPRT,64
BIT,LARGESEND,CHAIN>
        inet 127.0.0.1 netmask 0xff000000 broadcast 127.255.255.255
        inet6 ::1%1/0
         tcp_sendspace 131072 tcp_recvspace 131072 rfc1323 1

AIX netstat -rn:

$ netstat -rn
Routing tables
Destination        Gateway           Flags   Refs     Use  If   Exp  Groups

Route tree for Protocol Family 2 (Internet):
default            10.105.65.1       UG       31  39412125 en0      -      -
10.105.0.0         10.105.65.131     UHSb      0         0 en0      -      -   =
>
10.105/16          10.105.65.131     U       219 985607244 en0      -      -
10.105.65.131      127.0.0.1         UGHS      5   1326738 lo0      -      -
10.105.255.255     10.105.65.131     UHSb      3   6926640 en0      -      -
127/8              127.0.0.1         U        36  11962928 lo0      -      -

Route tree for Protocol Family 24 (Internet v6):
::1%1              ::1%1             UH        1    393270 lo0      -      -

我尝试了route get并且在我的AIX盒子上没有工作来告诉我路线。我唯一可以上班的是netstat -rn。我不确定是否有另一个类似于ip route的命令可行。

Linux框支持ipifconfig

当有多个网络接口卡时,我不知道该怎么办,因为我不知道在设置虚拟IP时应该使用哪一个。

Linux设置更多是我所关注的,因为我最终将在我的软件安装脚本的AIX支持中添加,然后可以对其进行更多的研究。

1 个答案:

答案 0 :(得分:2)

对于Linux,我可能会这样做(使用bash扩展,因此使用#!/bin/bash shebang调用,或者通过stdin将脚本传递给调用为ssh "$hostname" bash <<'EOF'的解释器):

internet_address=8.8.8.8 # read data for the NIC used to route here
dev_re='dev ([^[:space:]]+)($|[[:space:]])'
read default_route < <(ip -o route get "$internet_address")
[[ $default_route =~ $dev_re ]] && devname=${BASH_REMATCH[1]}

IFS=$'\n' read -r -d '' -a addresses < \
  <(netstat -rn | 
    awk -v dev="$devname" '$8 == dev && ($2 == "0.0.0.0" || $2 == "default") { print $1 }')

# emit this output however you like
printf '%s\n' "$dev_re" "${addresses[@]}"