我正在尝试仅使用IP地址(inet)作为我编写的脚本中的参数。
在unix终端中是否有一种简单的方法来获取IP地址,而不是通过ifconfig
查看?
答案 0 :(得分:133)
您可以编写仅返回IP的脚本:
/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f2 | awk '{print $1}'
对于MAC:
ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\ -f2
或者对于linux系统
hostname -i | awk '{print $3}' # Ubuntu
hostname -i # Debian
答案 1 :(得分:34)
这将为您提供所有IPv4接口,包括环回127.0.0.1:
ip -4 addr | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
这只会显示eth0
:
ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
通过这种方式,您可以获得IPv6地址:
ip -6 addr | grep -oP '(?<=inet6\s)[\da-f:]+'
仅eth0
IPv6:
ip -6 addr show eth0 | grep -oP '(?<=inet6\s)[\da-f:]+'
答案 2 :(得分:31)
通常,系统永远不会保证只有一个IP地址,例如,您可以同时拥有以太网和Wlan连接,如果您有一个活动的VPN连接,那么您将拥有另一个IP地址。
在Linux上,hostname -I
将列出当前的IP地址。依赖于它总是只返回一个IP地址很可能在某些情况下无法正常工作(即VPN链接已启动),因此更可靠的方法是将结果转换为数组然后遍历元素:
ips=($(hostname -I))
for ip in "${ips[@]}"
do
echo $ip
done
在OSX上,如果你知道界面,你可以使用:
~$ ipconfig getifaddr en0
192.168.1.123
将返回 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
此外,如果建立了有线和无线连接,当机器有多个以太网接口或存在VPN隧道时,获取IP地址将变为非确定性。
如果您需要外部IP,则可以查询文本模式服务,例如curl ipecho.net/plain
将返回纯文本外部 IP。
答案 3 :(得分:9)
hostname -I
此命令将在Ubuntu中为您提供所需的确切IP地址。
答案 4 :(得分:9)
在最新的 Ubuntu 版本( 14.04 - 16.04 )上,此命令对我有用。
hostname -I | awk '{print $1}'
答案 5 :(得分:7)
如果环境有限,可以使用以下命令:
ip -4 addr show dev eth0 | grep inet | tr -s " " | cut -d" " -f3 | head -n 1
答案 6 :(得分:4)
我们只需使用2个命令(ifconfig + awk)即可获得我们想要的IP(v4):
在Linux上,假设从eth0
接口获取IP地址,请运行以下命令:
/sbin/ifconfig eth0 | awk '/inet addr/{print substr($2,6)}'
在OSX上,假设从en0
接口获取IP地址,请运行以下命令:
/sbin/ifconfig en0 | awk '/inet /{print $2}'
要了解我们的公共/外部IP,请在~/.bashrc
whatismyip () {
curl -s "http://api.duckduckgo.com/?q=ip&format=json" | jq '.Answer' | grep --color=auto -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b"
}
然后运行whatismyip
答案 7 :(得分:4)
删除了命令ifconfig
,您应该在Linux上使用ip
命令。
同样ip a
会为您提供与IP相同的范围,因此更容易使用。
此命令将显示您的全局(外部)IP:
ip a | grep "scope global" | grep -Po '(?<=inet )[\d.]+'
所有IPv4(也是127.0.0.1):
ip a | grep "scope" | grep -Po '(?<=inet )[\d.]+'
所有IPv6(也是:: 1):
ip a | grep "scope" | grep -Po '(?<=inet6 )[\da-z:]+'
答案 8 :(得分:3)
要仅获取 Mac OS X 上的IP地址,您可以输入以下命令:
ipconfig getifaddr en0
答案 9 :(得分:3)
我想要一些简单的东西作为Bash别名。我发现hostname -I
最适合我(主机名v3.15)。由于某种原因,hostname -i
返回环回IP,但hostname -I
为wlan0提供了正确的IP,而无需通过grep或awk管道输出。缺点是hostname -I
将输出所有 IP,如果您有多个
答案 10 :(得分:2)
您还可以使用以下命令:
ip route | grep src
注意: 仅当您可以连接互联网时,此功能才起作用。
答案 11 :(得分:2)
在checkedContacts
中,有一种更简单的方法可以自动排除回送IP,并仅显示所有分配给主机IP地址的空格分隔的列表:
holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if (isChecked){
checkedContacts.add(contact);
} else {
checkedContacts.remove(contact);
}
}
});
答案 12 :(得分:2)
这可以在Mac上做到这一点:
ping $(ifconfig en0 | awk '$1 == "inet" {print $2}')
在我的机器中解析为ping 192.168.1.2
。
专家提示:$(...)
表示运行子shell中括号内的任何内容并将其作为值返回。
答案 13 :(得分:1)
这是我的版本,您可以在其中传递按优先级排序的接口列表:
getIpFromInterface()
{
interface=$1
ifconfig ${interface} > /dev/null 2>&1 && ifconfig ${interface} | awk -F'inet ' '{ print $2 }' | awk '{ print $1 }' | grep .
}
getCurrentIpAddress(){
IFLIST=(${@:-${IFLIST[@]}})
for currentInterface in ${IFLIST[@]}
do
IP=$(getIpFromInterface $currentInterface)
[[ -z "$IP" ]] && continue
echo ${IP/*:}
return
done
}
IFLIST=(tap0 en1 en0)
getCurrentIpAddress $@
因此,如果我与VPN,Wifi和以太网连接,我的VPN地址(在接口tap0上)将被返回。该脚本适用于linux和osx,如果要覆盖IFLIST
,则可以使用参数请注意,如果您想使用IPV6,则必须更换“#t; inet&#39;通过&#39; inet6&#39;。
答案 14 :(得分:1)
我不想在脚本中使用awk
等。ip
可以选择以JSON输出。
如果省略$interface
,则将获得所有ip地址:
ip -json addr show $interface | \
jq -r '.[] | .addr_info[] | select(.family == "inet") | .local'
答案 15 :(得分:1)
我还没有看到nmcli
的任何答案,它是用于控制NetworkManager的命令行工具。
所以你去:)
wolf@linux:~$ nmcli device
DEVICE TYPE STATE CONNECTION
eth1 ethernet unavailable --
eth0 ethernet unmanaged --
lo loopback unmanaged --
wolf@linux:~$
如果您想从特定的网络接口获取信息(对于此示例,请说lo
)
wolf@linux:~$ nmcli device show lo
GENERAL.DEVICE: lo
GENERAL.TYPE: loopback
GENERAL.HWADDR: 00:00:00:00:00:00
GENERAL.MTU: 65536
GENERAL.STATE: 10 (unmanaged)
GENERAL.CONNECTION: --
GENERAL.CON-PATH: --
IP4.ADDRESS[1]: 127.0.0.1/8
IP4.GATEWAY: --
IP4.ROUTE[1]: dst = 127.0.0.0/8, nh = 0.0.0.0,>
IP4.ROUTE[2]: dst = 127.0.0.1/32, nh = 0.0.0.0>
IP6.ADDRESS[1]: ::1/128
IP6.GATEWAY: --
IP6.ROUTE[1]: dst = ::1/128, nh = ::, mt = 256
IP6.ROUTE[2]: dst = ::1/128, nh = ::, mt = 0, >
wolf@linux:~$
但是由于您只想获取IP地址,因此只需将输出发送到grep
,cut
或awk
。
让我们一步一步地做。 (不知道出了什么问题,代码示例格式对于这3个示例均无效。)
获取IPv4行
wolf @ linux:〜$ nmcli device show lo | grep 4.A IP4.ADDRESS [1]:127.0.0.1/8 wolf @ linux:〜$
使用awk
来获取IP
wolf @ linux:〜$ nmcli device show lo | awk'/4.A/ {print $ 2}' 127.0.0.1/8 wolf @ linux:〜$
使用cut
删除CIDR表示法(/ 8)
wolf @ linux:〜$ nmcli device show lo | awk'/4.A/ {print $ 2}'|切-d / -f1 127.0.0.1 wolf @ linux:〜$
有你的答案。
请注意,有很多方法可以使用我刚才演示的工具来实现。
让我们回顾一下我使用的命令。
nmcli device show lo | grep 4.A
nmcli device show lo | awk '/4.A/ {print $2}'
nmcli device show lo | awk '/4.A/ {print $2}' | cut -d / -f1
这3个命令的示例输出
命令1输出
IP4.ADDRESS[1]: 127.0.0.1/8
命令2输出
127.0.0.1/8
命令3输出
127.0.0.1
答案 16 :(得分:1)
使用这一行脚本:
ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr($0,RSTART,RLENGTH)}'
mac&amp; linux(在ubuntu中测试)都可以。
答案 17 :(得分:1)
使用以下命令:
/sbin/ifconfig $(netstat -nr | tail -1 | awk '{print $NF}') | awk -F: '/inet /{print $2}' | cut -f1 -d ' '
答案 18 :(得分:1)
答案 19 :(得分:1)
我总是在最意想不到的时候最需要这个,并且最终会在SO上搜索这样的线程。所以我写了一个简单的脚本来通过netstat获取IPv4地址,称为echoip
- you can find it here。网络地址的bash看起来像这样,它也从ipecho.net获取你的公共地址:
IPV4='\d+(\.\d+){3}'
INTERFACES=`netstat -i | grep -E "$IPV4" | cut -d ' ' -f 1`
INTERFACE_IPS=`netstat -i | grep -oE "$IPV4"`
for i in "${!INTERFACES[@]}"; do
printf "%s:\t%s\n" "${INTERFACES[$i]}" "${INTERFACE_IPS[$i]}"
done
echoip
脚本产生如下输出:
$ echoip
public: 26.106.59.169
en0: 10.1.10.2
答案 20 :(得分:0)
默认路由的IPv4地址:
ip address show $(ip route | grep "^default " | head -n1 | grep -Po "(?<=dev )[^ ]+") | grep -Po "(?<=inet )[^ /]+"
默认路由的IPv6地址:
ip address show $(ip route | grep "^default " | head -n1 | grep -Po "(?<=dev )[^ ]+") | grep -Po "(?<=inet6 )[^ /]+"
这些仅需要命令ip
和grep
,并支持-P
和-o
。 head -1
是必需的,因为当系统具有足够复杂的网络设置时,ip route
可能会显示多个默认路由。
如果您不介意哪个IP,就可以这样做
ip route | grep -Po '(?<=src )[^ ]+'
或
hostname --all-ip-addresses
答案 21 :(得分:0)
如果您不想使用ifconfig
或正则表达式...
ip addr | grep eth0 | grep inet | awk '{print $2}' | cut -d"/" -f1
答案 22 :(得分:0)
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 发行版
答案 23 :(得分:0)
这两种方式对我有用:
获取接口eth0的IP地址。将以下示例中的eth0替换为您的接口名称。
ifconfig eth0 | grep -w "inet" | tr -s " " | cut -f3 -d" "
使用主机名: 这将为您提供inet,即您的etho的IPAddress。使用-I将为您提供所有存在此值的接口的inet值。
hostname -i
答案 24 :(得分:0)
几乎没有答案正在使用较新的ip
命令(替换为ifconfig
),因此以下是使用ip addr
,grep
和awk
的答案只需打印与wlan0
接口相关联的IPv4地址:
ip addr show wlan0|grep inet|grep -v inet6|awk '{print $2}'|awk '{split($0,a,"/"); print a[1]}'
虽然不是最紧凑或最理想的解决方案,但它(可以说)很容易理解(请参阅下面的说明),并可以出于其他目的进行修改,例如像这样获得MAC地址的最后3个八位字节:
ip addr show wlan0|grep link/ether|awk '{print $2}'|awk '{split($0,mac,":"); print mac[4] mac[5] mac[6]}'
说明: 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
下一步grep inet
过滤掉不包含“ inet”(IPv4和IPv6配置)的行,而grep -v inet6
过滤掉要做的包含“ inet6”的其余行”,结果应为单行:
inet 172.18.18.1/24 brd 172.18.18.255 scope global noprefixroute wlan0
最后,第一个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
答案 25 :(得分:0)
仅打印eth0
的IP地址,而不打印其他文本:
ifconfig eth0 | grep -Po '(?<=inet )[\d.]+'
要确定您的主界面(因为它可能不是“ eth0”),请使用:
route | grep ^default | sed "s/.* //"
以上两行可以合并为一个命令,如下所示:
ifconfig `route | grep ^default | sed "s/.* //"` \
| grep -Po '(?<=inet )[\d.]+'
答案 26 :(得分:0)
在经过NAT转换的主机上查找外部IP地址时,很多答案建议使用基于HTTP的方法,例如ifconfig.me
,例如:
$ curl ifconfig.me/ip
这些年来,我看到了许多这样的网站,我发现这种基于DNS的方法更加可靠:
$ dig +short myip.opendns.com @resolver1.opendns.com
我的~/.bashrc
中有这个方便的别名:
alias wip='dig +short myip.opendns.com @resolver1.opendns.com'
答案 27 :(得分:0)
select v.testid, max(v.score), min(v.score) max(v.TestTakenOn),
max(case when seqnum_desc = 1 then resultid end) as resultid_max,
max(case when seqnum_asc = 1 then resultid end) as resultid_min
from (select r.resultid, v.*,
row_number() over (partition by v.testid order by v.score asc) as seqnum_asc,
row_number() over (partition by v.testid order by v.score desc) as seqnum_desc
from results r cross apply
(values (Test_UK, TestUK_Scr, TestTakenOn),
(Test_US, TestUS_Scr, TestTakenOn)
) v(testid, score, TestTakenOn)
) v
group by v.testid;
答案 28 :(得分:0)
在Redhat 64bit上,这解决了我的问题。
ifconfig $1|sed -n 2p|awk '{ print $2 }'|awk -F : '{ print $2 }'
答案 29 :(得分:0)
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'
显示所有ips
答案 30 :(得分:-1)
curl ifconfig.co
只返回系统的IP地址。
答案 31 :(得分:-2)
我会使用Hostname -L
来获取用作脚本变量的IP。