我想在我的Debian 7.3上制作大脚本(类似于已翻译的内容和更新的用户友好环境)。我有个问题。我只想使用命令给我的一些信息。例如,我的ifconfig看起来像:
eth0 Link encap:Ethernet HWaddr 08:00:27:a3:e3:b0
inet addr:192.168.1.103 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1309425 (1.2 MiB) T
我想只显示行中的IP地址:echo“你的IP地址是:(IP_ADDRESS)”。是否有任何命令允许我做这样的事情,在流中搜索我想要得到的信息?我知道grep
和sed
,但我对他们并不擅长。
编辑:首先要感谢你帮我解决这个问题,现在我知道的更多了。其次说项目正在进行中。如果有人对我感兴趣的话。
答案 0 :(得分:80)
如果目标是找到互联网方向连接的IP地址,那么这应该是一个很好的解决方案。
UPDATE !!! 使用新版本的linux,您可以获得更多有关该行的信息:
ip route get 8.8.8.8
8.8.8.8 via 10.36.15.1 dev ens160 src 10.36.15.150 uid 1002
cache
所以要获得IP,你需要在 src
之后找到IPip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}'
10.36.15.150
找到使用的IP和接口:
ip route get 8.8.8.8
8.8.8.8 via 10.10.10.1 dev eno1 src 192.168.3.33
cache
然后提取IP:
ip route get 8.8.8.8 | awk 'NR==1 {print $NF}'
192.168.3.33
ip route
没有打开任何连接,它只显示了到达8.8.8.8
所需的路线。 8.8.8.8
是Google的DNS。
为什么其他解决方案可能会失败:
ifconfig eth0
Hostname -I
如果您想将其存储到变量中,请执行以下操作:
my_ip=$(ip route get 8.8.8.8 | awk -F"src " 'NR==1{split($2,a," ");print a[1]}')
my_interface=$(ip route get 8.8.8.8 | awk -F"dev " 'NR==1{split($2,a," ");print a[1]}')
答案 1 :(得分:35)
只需获取您的IP地址:
echo `ifconfig eth0 2>/dev/null|awk '/inet addr:/ {print $2}'|sed 's/addr://'`
这将为您提供eth0的IP地址。
编辑:由于最近版本的Ubuntu中接口的名称更改,这不再起作用。相反,你可以使用它:
hostname --all-ip-addresses
或hostname -I
,它执行相同的操作(为您提供主机的所有IP地址)。
答案 2 :(得分:34)
如果您想获得以空格分隔的IP列表,可以使用hostname
命令和--all-ip-addresses
(短-I
)标记
hostname -I
如下所述:Putting IP Address into bash variable. Is there a better way?
答案 3 :(得分:7)
ip -4 addr show eth0 | grep -oP "(?<=inet ).*(?=/)"
答案 4 :(得分:4)
选择:
$ cat file
eth0 Link encap:Ethernet HWaddr 08:00:27:a3:e3:b0
inet addr:192.168.1.103 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fea3:e3b0/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1904 errors:0 dropped:0 overruns:0 frame:0
TX packets:2002 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1309425 (1.2 MiB) T
$ awk 'sub(/inet addr:/,""){print $1}' file
192.168.1.103
$ awk -F'[ :]+' '/inet addr/{print $4}' file
192.168.1.103
答案 5 :(得分:4)
/sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
答案 6 :(得分:4)
可能并非适用于所有情况(特别是如果你有几个NIC),这将有所帮助:
hostname -I | awk '{ print $1 }'
答案 7 :(得分:3)
ip route get 8.8.8.8| grep src| sed 's/.*src \(.*\)$/\1/g'
答案 8 :(得分:2)
请注意,因为我花了一些时间来解决服务器上的拙劣升级问题。
事实证明,(多年前)我已经实施了一项测试,看看是否存在动态添加的接口(例如eth0:1),如果存在,我会将某些proggis绑定到eth0上的'main'IP。基本上它是'ifconfig | grep ... | sed ...'解决方案的变体(加上检查'eth0:'存在)。
升级带来了新的网络工具,随之而来的输出略有改变:
旧的ifconfig:
eth0 Link encap:Ethernet HWaddr 42:01:0A:F0:B0:1D
inet addr:10.240.176.29 Bcast:10.240.176.29 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1460 Metric:1
...<SNIP>
而新版本将显示:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1460
inet 10.240.212.165 netmask 255.255.255.255 broadcast 10.240.212.165
...<SNIP>
渲染'eth0:'以及'inet addr:'搜索被破坏(更不用说'em0','br0'或'wlan0'......)。当然你可以检查'inet'(或'inet6'),并使addr:part可选,但仔细观察,你会发现或多或少的一切都发生了变化,'Mask'现在是'netmask',..
'ip route ...'建议非常漂亮 - 所以也许吧:
_MyIP="$( ip route get 8.8.8.8 | awk 'NR==1 {print $NF}' )"
if [ "A$_MyIP" == "A" ]
then
_MyIPs="$( hostname -I )"
for _MyIP in "$_MyIPs"
do
echo "Found IP: \"$_MyIP\""
done
else
echo "Found IP: $_MyIP"
fi
嗯,无论如何都是那样的。由于所有提议的解决方案似乎都存在失败的情况,因此请检查可能的边缘情况 - 没有eth,多个eth&amp; lo,什么时候'主机名-i'会失败,......然后决定最佳解决方案,检查它是否有效,否则排在第二位。
干杯'啤酒!
答案 9 :(得分:0)
在我看来,实现您所需要的最简单,最优雅的方式是:
namespace App\Controllers;
use DDesrosiers\SilexAnnotations\Annotations as SLX;
use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use R; // <-- Notice this
/**
* @SLX\Controller(prefix="article")
*/
class ArticleController
{
// Use: R::findAll('article') in any method in this class
}
PHP
- 为您提供用于访问远程主机的网关,例如:
@Remote
public interface PlayerServiceRemote {
ip route get 8.8.8.8 | tr -s ' ' | cut -d' ' -f7
- 删除任何多余的空格,现在你有一致性,例如:
ip route get [host]
8.8.8.8 via 192.168.0.1 dev enp0s3 src 192.168.0.109
- 将字符串截断为&#39; &#39;空格分隔的字段,然后从中选择字段#7,例如:
tr -s ' '
答案 10 :(得分:0)
对以前的ip route ...
解决方案之一进行了微小的修改,从而消除了对grep的需求:
ip route get 8.8.8.8 | sed -n 's|^.*src \(.*\)$|\1|gp'
答案 11 :(得分:0)
awk '/inet addr:/{gsub(/^.{5}/,"",$2); print $2}' file
192.168.1.103
答案 12 :(得分:0)
如果您只想使用sed提取IP地址:
ifconfig eth0 2>/dev/null sed -n 's/.*[[:space:]]\([[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*\.[[:digit:]][[:digit:]]*\).*/\1/p'