Mas*_*son 101 unix shell ip-address
我正在尝试仅使用IP地址(inet)作为我编写的脚本中的参数.
在unix终端中是否有一种简单的方法来获取IP地址,而不是通过查找ifconfig?
Boo*_*eus 150
你可以编写一个只返回IP的脚本:
/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
对于MAC:
ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\ -f2
Run Code Online (Sandbox Code Playgroud)
或者对于linux系统
hostname -i | awk '{print $3}' # Ubuntu
hostname -i # Debian
Run Code Online (Sandbox Code Playgroud)
SAM*_*SAM 46
这将为您提供所有IPv4接口,包括环回127.0.0.1:
ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
Run Code Online (Sandbox Code Playgroud)
这只会显示eth0:
ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
Run Code Online (Sandbox Code Playgroud)
这样你就可以获得IPv6地址:
ip -6 addr | grep -oP '(?<=inet6\s)[\da-f:]+'
Run Code Online (Sandbox Code Playgroud)
只有eth0IPv6:
ip -6 addr show eth0 | grep -oP '(?<=inet6\s)[\da-f:]+'
Run Code Online (Sandbox Code Playgroud)
ccp*_*zza 33
通常,系统永远不会保证只有一个IP地址,例如,您可以同时拥有以太网和Wlan连接,如果您有一个活动的VPN连接,那么您将拥有另一个IP地址.
在Linux上,hostname -I将列出当前的IP地址.依赖于它总是只返回一个IP地址很可能在某些情况下不能正常工作(即VPN链接已启动),因此更可靠的方法是将结果转换为数组,然后循环遍历元素:
ips=($(hostname -I))
for ip in "${ips[@]}"
do
echo $ip
done
Run Code Online (Sandbox Code Playgroud)
在OSX上,如果您知道接口,则可以使用:
~$ ipconfig getifaddr en0
192.168.1.123
Run Code Online (Sandbox Code Playgroud)
这将只返回IP地址.
或者你可以循环遍历可能的接口名称,从后缀开始,即en:
for NUMBER in $(seq 0 5); do
ip=`ipconfig getifaddr en$NUMBER`
if [ -n "$ip" ]; then
myip="$ip"
break
fi
done
echo $myip
Run Code Online (Sandbox Code Playgroud)
此外,如果建立了电缆和wifi连接,当计算机具有多个以太网接口或存在VPN隧道时,获取IP地址将变得不确定.
如果您需要外部IP,则可以查询文本模式服务,例如curl https://ipecho.net/plain返回纯文本外部 IP.
Vig*_*eth 11
hostname -I
Run Code Online (Sandbox Code Playgroud)
此命令将在Ubuntu中为您提供所需的确切IP地址.
小智 10
要在Mac OS X上仅获取 IP 地址,您可以键入以下命令:
ipconfig getifaddr en0
Run Code Online (Sandbox Code Playgroud)
Da *_*Kid 10
在最新的Ubuntu版本(14.04 - 16.04)上,这个命令对我有用.
hostname -I | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
Tal*_*ion 10
我不喜欢在脚本中使用awk此类。ip可以选择以 JSON 格式输出。
如果省略,$interface您将获得所有 IP 地址:
ip -json addr show $interface | \
jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'
Run Code Online (Sandbox Code Playgroud)
如果您的环境有限,可以使用以下命令:
ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
Run Code Online (Sandbox Code Playgroud)
ip -4 addr show eth0在某些机器上不起作用。例如,我收到此错误:
ip: symbol lookup error: ip: undefined symbol: bpf_program__section_name, version LIBBPF_0.2.0
这对我有用:
/sbin/ifconfig eth0 | grep 'inet ' | awk '{ print $2}'
Run Code Online (Sandbox Code Playgroud)
这比接受的答案少了一个管道。另外,我的 ifconfig 输出没有inet addr.
要获取 IPv6 地址,请使用以下命令:
/sbin/ifconfig eth0 | grep 'inet6 ' | awk '{ print $2}'
Run Code Online (Sandbox Code Playgroud)
我想要一些简单的东西作为 Bash 别名。我发现这hostname -I最适合我(主机名 v3.15)。hostname -i由于某种原因返回环回 IP,但hostname -I为我提供了 wlan0 的正确 IP,并且无需通过 grep 或 awk 管道输出。缺点是如果您有多个 IP,hostname -I则会输出所有IP。
命令ifconfig已删除,您应该ip在Linux上使用命令.
同时ip a会给你范围在同一行的IP所以它更容易使用.
此命令将显示您的全局(外部)IP:
ip a | grep "scope global" | grep -Po '(?<=inet )[\d.]+'
Run Code Online (Sandbox Code Playgroud)
所有IPv4(也是127.0.0.1):
ip a | grep "scope" | grep -Po '(?<=inet )[\d.]+'
Run Code Online (Sandbox Code Playgroud)
所有IPv6(也是:: 1):
ip a | grep "scope" | grep -Po '(?<=inet6 )[\da-z:]+'
Run Code Online (Sandbox Code Playgroud)
只打印 的 IP 地址eth0,不打印其他文本:
ifconfig eth0 | grep -Po '(?<=inet addr:)[\d.]+'
Run Code Online (Sandbox Code Playgroud)
要确定您的主要接口(因为它可能不是“eth0”),请使用:
route | grep ^default | sed "s/.* //"
Run Code Online (Sandbox Code Playgroud)
以上两行可以组合成一个命令,如下所示:
ifconfig `route | grep ^default | sed "s/.* //"` \
| grep -Po '(?<=inet addr:)[\d.]+'
Run Code Online (Sandbox Code Playgroud)
几个答案似乎是使用较新的ip命令(替代ifconfig),所以这里是一个用途ip addr,grep以及awk简单地打印与相关联的IPv4地址wlan0的接口:
ip addr show wlan0|grep inet|grep -v inet6|awk '{print $2}'|awk '{split($0,a,"/"); print a[1]}'
Run Code Online (Sandbox Code Playgroud)
虽然不是最紧凑或最花哨的解决方案,但它(可以说)很容易理解(请参阅下面的解释)并出于其他目的进行修改,例如像这样获取 MAC 地址的最后 3 个八位字节:
ip addr show wlan0|grep link/ether|awk '{print $2}'|awk '{split($0,mac,":"); print mac[4] mac[5] mac[6]}'
Run Code Online (Sandbox Code Playgroud)
说明: ip addr show wlan0输出与名为 的网络接口相关联的信息wlan0,应该类似于:
4: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether dc:a6:32:04:06:ab brd ff:ff:ff:ff:ff:ff
inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
valid_lft forever preferred_lft forever
inet6 fe80::d340:5e4b:78e0:90f/64 scope link
valid_lft forever preferred_lft forever
Run Code Online (Sandbox Code Playgroud)
接着grep inet过滤器的行数不包含“INET”(IPv4和IPv6配置)和grep -v inet6过滤出各剩余行的是做含有“INET6”,这将导致这样的一个单条线:
inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
Run Code Online (Sandbox Code Playgroud)
最后,第一个awk提取“172.18.18.1/24”字段,第二个删除网络掩码速记,只留下 IPv4 地址。
另外,我认为值得一提的是,如果您正在编写脚本,那么通常有许多更丰富和/或更强大的工具来获取此信息,您可能想要使用它们。例如,如果使用 Node.js 有ipaddr-linux,如果使用 Ruby 有linux-ip-parser,等等。
另见https://unix.stackexchange.com/questions/119269/how-to-get-ip-address-using-shell-script
小智 5
ip addr,最短的方法
ip -4 -br addr show enp1s0 | awk -F" " '{print $3}'|cut -d'/' -f1
或缩短
ip -4 -br a s enp1s0 | awk -F" " '{print $3}'|cut -d'/' -f1
必须在大多数现代 Linux 发行版中工作
在Ubuntu(以及Debian之类的发行版)上
要仅获取本地地址数字,请执行以下命令:
hostname -I | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
要全面了解网络接口配置和全局 IP 地址使用情况:
curl -4 icanhazip.com
curl ifconfig.co //this responds faster
Run Code Online (Sandbox Code Playgroud)
要深入了解任何 IP 地址(包括您自己的 IP 地址)的奥秘:
whois $(curl ifconfig.co)
Run Code Online (Sandbox Code Playgroud)
确保您已whois安装该工具。如果没有,只需执行:
sudo apt-get install whois
Run Code Online (Sandbox Code Playgroud)