Альтернатива ls
если Вы только хотите некоторые поля, OS/X's stat
команда:
find . ! -name . -prune ! -type d -exec stat -t '%FT%T' -f '%15z %SB %N' {} +
Или с zsh
:
command stat -t '%FT%T' -f '%15z %SB %N' -- *(D^/)
(%B
, ls -U
OS/X конкретный, другие Нельды обычно не имеют inode времен рождения).
Вот еще один слегка метод Terser с использованием PRECFS
(предполагает, что вы используете Linux):
default_iface=$(awk '$2 == 00000000 { print $1 }' /proc/net/route)
ip addr show dev "$default_iface" | awk '$1 ~ /^inet/ { sub("/.*", "", $2); print $2 }'
Это возвращает как IPv4, так и (если имеется) адрес IPv6 интерфейс. Вы можете изменить тест, если вы хотите только один или другой (искать INET
для IPv4, а INET6
для IPv6).
$ default_iface=$(awk '$2 == 00000000 { print $1 }' /proc/net/route)
$ ip addr show dev "$default_iface" | awk '$1 ~ /^inet/ { sub("/.*", "", $2); print $2 }'
10.0.2.15
fe80::a00:27ff:fe45:b085
$ ip addr show dev "$default_iface" | awk '$1 == "inet" { sub("/.*", "", $2); print $2 }'
10.0.2.15
$ ip addr show dev "$default_iface" | awk '$1 == "inet6" { sub("/.*", "", $2); print $2 }'
fe80::a00:27ff:fe45:b085
Если то, что вы хотите, это IP-адрес, назначенный на интерфейс по умолчанию (который я понял из комментариев под вопросом), используя швейцарский армейский нож сетевого настройки ( IP.
) должно быть достаточно:
$ ip route | grep '^default'
default via 10.176.143.1 dev eth1 metric 203
$ ip addr show eth1
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether c0:de:f1:72:30:48 brd ff:ff:ff:ff:ff:ff
inet 10.176.143.71/24 brd 10.176.143.255 scope global eth1
valid_lft forever preferred_lft forever
Это сокращает до
$ ip addr show \
$( /sbin/ip route \
| grep '^default'\
| sed 's/^.*dev \([^ \t]*\) .*$/\1/' )
, что является уродливым, потому что он разбирает что-то, что, вероятно, на самом деле не предназначено для анализа (вывод IP-маршрута
), но должно сработать.
Вот что я писал:
Это распечатает, какой интерфейс является «по умолчанию». Для моего хоста мне нужно получить последний столбец строки по умолчанию.
[root@pppdc9prd3ga mdesales]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.4.0 * 255.255.252.0 U 0 0 0 bridge0
10.132.60.0 * 255.255.252.0 U 0 0 0 eth4
link-local * 255.255.0.0 U 1002 0 0 eth4
link-local * 255.255.0.0 U 1003 0 0 bridge0
default 10.132.60.1 0.0.0.0 UG 0 0 0 eth4
Просто получить ADDR: значение.
[root@pppdc9prd3ga mdesales]# ifconfig eth4
eth4 Link encap:Ethernet HWaddr 00:50:56:01:42:91
inet addr:10.132.63.191 Bcast:10.132.63.255 Mask:255.255.252.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1346288 errors:0 dropped:0 overruns:0 frame:0
TX packets:438844 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:276243478 (263.4 MiB) TX bytes:116188062 (110.8 MiB)
Итак, вот сценарий, с которым я придумал.
/app/myPublicIp.sh
defaultInterface=$(route | grep default | awk '{print $(NF)}')
ifconfig $defaultInterface | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
Вот он выполняет:
/app/ipFor.sh
10.132.63.191
Здесь много хороших ответов, но хотел бросить в мой обычный подход:
Самое простое решение - получить маршрут для общедоступного интернет-адреса:
$ ip route get 1.1.1.1 | grep -oP 'src \K\S+'
192.168.0.20
Другое решение - получить шлюз по умолчанию, а затем получить IP Addr используется для связи с этим шлюзом:
$ ip route get $(ip route show 0.0.0.0/0 | grep -oP 'via \K\S+') | grep -oP 'src \K\S+'
192.168.0.20
Простая команда с интерфейсом по умолчанию.
ip route | grep src | awk '{print $NF; exit}'
Проверено на всех ОС Unix
Это сработало для меня на Centos 7. Найдите интерфейс по умолчанию, используяip
ifconfig $(ip route | awk '/default/ { print $5 }') | grep "inet " | awk '{print $2}'
Любая ОС Linux -с использованием /proc
(, но без использования iproute
инструментов):
cat /proc/net/fib_trie|grep -A50 '\|-- 0\.0\.0\.0$'|grep -B50 -wm1 'LOCAL'|tail -n2|grep -oP '\|-- \K\S+'
Мой любимый следующий.
Получить интерфейс по умолчанию:
$ ip r | grep -oP 'default.* \K.+'
eth0
Получить IP-адрес интерфейса:
$ ip a show eth0 | grep -oP 'inet \K[\d\.]+'
10.33.44.135
Комбинированный:
$ ip a show $(ip r | grep -oP 'default.* \K.+') | grep -oP 'inet \K[\d\.]+'
10.33.44.135