linux - 如何确定远程SSH登录的子网掩码和网卡?

标签 linux shell ssh network-programming aix

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

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

感谢您提供的任何帮助!

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

--更新--

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

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

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

最佳答案

对于 Linux,我可能会这样做(使用 bash 扩展,因此使用 #!/bin/bash shebang 调用,或者将脚本通过标准输入管道传输到以 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[@]}"

关于linux - 如何确定远程SSH登录的子网掩码和网卡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30246952/

相关文章:

linux - ffmpeg 从 Linux 管道读取图像路径时显示 "No JPEG data found in image"

linux - gitlab git-data文件夹权限

linux - 如何仅区分 2 个目录的 cpp 文件?

php - 如何使用 php 执行 shell cmd(python)并打印所有不断更新的输出?

xcode - xcode 中的 Bash 脚本返回 Shell 脚本调用错误

bash - 将 shell 脚本输出复制到剪贴板

linux - 如何将 stderr 重定向到一个文件并将一些回显(不是 stdout)重定向到同一个文件

ssh - 如何检查scp是否可用?

swift - 使用 Swift 的 SSH 连接

macos - 修改电脑名称后无法登录Github for Mac客户端