Идентификатор частного IP-адреса в регулярном выражении

Должно быть возможным вызвать исполняемый файл с определенным рабочим каталогом, используя Runtime.exec(String command, String[] envp, File dir)

следующим образом:

Process process2=Runtime.getRuntime().exec("/data/data/my-package/files/myfile",
        null, new File("/data/data/my-package/files"));

, возможно, без полный путь к myfile

Process process2=Runtime.getRuntime().exec("myfile",
        null, new File("/data/data/my-package/files"));

Context#getFilesDir() вместо жесткого кодирования, путь тоже должен работать и безопаснее, чем указывать путь самостоятельно, так как не гарантируется, что /data/data/.. всегда правильный путь для всех устройств.

Process process2=Runtime.getRuntime().exec("myfile",
        null, getFilesDir()));

Проблема с cd somewhere заключается в том, что каталог изменен для другого Процесса, поэтому второй вызов exec в новом Процессе не видит изменения.

29
задан Liath 9 January 2014 в 10:10
поделиться

3 ответа

Я предполагаю, что вы хотите сопоставить эти диапазоны:

127.  0.0.0 – 127.255.255.255     127.0.0.0 /8
 10.  0.0.0 –  10.255.255.255      10.0.0.0 /8
172. 16.0.0 – 172. 31.255.255    172.16.0.0 /12
192.168.0.0 – 192.168.255.255   192.168.0.0 /16

У вас отсутствуют некоторые точки, которые могли бы привести к его принятию, например, 172.169.0.0 , даже если это не должно быть принято. Я исправил это ниже. Удалите новые строки, это просто для удобства чтения.

(^127\.)|
(^10\.)|
(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|
(^192\.168\.)

Также обратите внимание, что это предполагает, что IP-адреса уже были проверены - он принимает такие вещи, как 10.foobar .

53
ответ дан 27 November 2019 в 21:39
поделиться

Это на случай, если вы решите согласиться с моим комментарием, предлагающим не использовать regexps. Непроверено (но, вероятно, работает, или, по крайней мере, близко), в Perl:

@private = (
    {network => inet_aton('127.0.0.0'),   mask => inet_aton('255.0.0.0')   },
    {network => inet_aton('192.168.0.0'), mask => inet_aton('255.255.0.0') },
    # ...
);

$ip = inet_aton($ip_text);
if (grep $ip & $_->{mask} == $_->{network}, @private) {
    # ip address is private
} else {
    # ip address is not private
}

Обратите внимание, что @private - это просто данные, которые вы можете легко изменить. Или загрузите на лету из Cymru Bogon Reference.

edit: Мне пришло в голову, что запрос на Perl regexp не означает, что вы знаете Perl, поэтому ключевой строкой здесь является 'grep', который просто перебирает каждый диапазон частных адресов. Вы берете свой IP, побитово складываете его с маской сети и сравниваете с сетевым адресом. Если они равны, то он является частью этой частной сети.

3
ответ дан 27 November 2019 в 21:39
поделиться

Выглядит правильно. Лично я бы изменил первый вариант на:

^127\.0 

С этим: (^127\.0\.0\.0\.1) вы ищете все, что начинается с 127.0.0.1 и пропустите 127.0.0.2*, 127.0.2.*, 127.0.* и т.д.

3
ответ дан 27 November 2019 в 21:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: