簡単に言えば、Bashスクリプトの文字列が有効なIPアドレスを表すことを確認したいと思います。私は他の多くの人のように正規表現を使ってこれを実行しようとするトラップに陥ったと思います。これはIPv4には十分でしたが、IPv6はより複雑で(ゼロ圧縮をサポートするため)、複雑で特に読みにくいソリューションです。 。
しかし、UnixとLinuxはIPアドレスを明確に理解しているので、bashでIPアドレスをチェックするより良い方法があるかどうか疑問に思います。これを行うために使用できるかなり一般的なツールを使用することをお勧めします。
filter_var
実際にはPHP関数を使用する現在のソリューションを置き換えたいので、他の言語(Pythonなど)を使用したくありません。動作しますが、正規表現と同様に、1つでは使用したくない2番目の言語を紹介します。
0.0.0.0-255.255.255.255
最後に、IPアドレス範囲(例えば、など)も処理するソリューションがあれば理想的でしょうが0.0.0.0/16
、これを直接処理することはできます。
ベストアンサー1
ipコマンドを使うのはどうですか?
ip route get <ip-address>
無効な場合、戻り値は 1 です。
(2022/9/17)@MaXi32さんのコメントに返信するために、インターネット接続なしで私のLinuxノートブックですばやく確認してみました。ネットワークが閉じると、ip コマンドは無効な IP に対して 1 を返し、有効な IP に対して 2 を返します。
有効なIPの場合:
$ ip route get 192.168.0.255 ; echo $?
RTNETLINK answers: Network is unreachable
2
$ ip route get fd00::192.168.0.255 ; echo $?
RTNETLINK answers: Network is unreachable
2
無効なIPの場合:
$ ip route get 192.168.0.256 ; echo $?
Error: any valid prefix is expected rather than "192.168.0.256".
1
$ ip route get fd00::192.168.0.256 ; echo $?
Error: any valid prefix is expected rather than "fd00::192.168.0.256".
1
IPコマンドバージョン:
$ ip -V
ip utility, iproute2-5.9.0, libbpf 0.3.0
(2022/9/17#2)inet_ptonを使って小さなプログラムを書くことができます。私はこれが良いと思います。次のコードは例から得られます。inet_pton マンページIPをテキストからバイナリに変換しようとし、IPが無効な場合はエラーが発生します。
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main(int argc, char *argv[])
{
unsigned char buf[sizeof(struct in6_addr)];
int domain, s;
char str[INET6_ADDRSTRLEN];
if (argc != 3) {
fprintf(stderr, "Usage: %s {i4|i6|<num>} string\n", argv[0]);
exit(EXIT_FAILURE);
}
domain = (strcmp(argv[1], "i4") == 0) ? AF_INET :
(strcmp(argv[1], "i6") == 0) ? AF_INET6 : atoi(argv[1]);
s = inet_pton(domain, argv[2], buf);
if (s <= 0) {
if (s == 0)
fprintf(stderr, "Not in presentation format");
else
perror("inet_pton");
exit(EXIT_FAILURE);
}
if (inet_ntop(domain, buf, str, INET6_ADDRSTRLEN) == NULL) {
perror("inet_ntop");
exit(EXIT_FAILURE);
}
printf("%s\n", str);
exit(EXIT_SUCCESS);
}