Получить доступ к таблице ARP без рута в Android
Я недавно работаю над проектом Android, который требует доступа к таблице ARP. Одно из требований состоит в том, чтобы избегать любых методов, которые требуют корневого устройства. Итак, мой вопрос: есть ли способ получить доступ к таблице ARP в Android без рута устройства?
В настоящее время я обнаружил, что большинство подходов используют /proc/net/arp для доступа к таблице ARP, для которой требуется разрешение root, и я не уверен, является ли это единственным способом.
5 ответов
Я могу получить доступ к таблице ARP без рута. Вот мой код:
string GetMACAddressviaIP(string ipAddr)
{
string result = "";
ostringstream ss;
ss << "/proc/net/arp";
string loc = ss.str();
ifstream in(loc);
if(!in)
{
printf("open %s failed\n",loc.c_str());
return result;
}
string line;
while(getline(in, line)){
if(strstr(line.c_str(), ipAddr.c_str()))
{
const char *buf = strstr(line.c_str(), ":") - 2;
int counter = 0;
stringstream ss;
while(counter < 17)
{
ss << buf[counter];
counter++;
}
result = ss.str();
}
}
return result;
}
Для лучшего понимания, используя язык Java, вы можете получить таблицу ARP в Android как:
BufferedReader br = null;
ArrayList<ClientScanResult> result = new ArrayList<ClientScanResult>();
try {
br = new BufferedReader(new FileReader("/proc/net/arp"));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
}Catch(Exception e){
}finally {
try {
br.close();
} catch (IOException e) {
}
}
Я рекомендую что-то вроде следующего для Java. Это объединяет ответы для двух других. Это не проверено, поэтому может потребоваться некоторые настройки, но вы поняли идею.
public String getMacAddressForIp(final String ipAddress) {
try (BufferedReader br = new BufferedReader(new FileReader("/proc/net/arp"))) {
String line;
while ((line = br.readLine()) != null) {
if (line.contains(ipAddress)) {
final int macStartIndex = line.indexOf(":") - 2;
final int macEndPos = macStartIndex + 17;
if (macStartIndex >= 0 && macEndPos < line.length()) {
return line.substring(macStartIndex, macEndPos);
} else {
Log.w("MyClass", "Found ip address line, but mac address was invalid.");
}
}
}
} catch(Exception e){
Log.e("MyClass", "Exception reading the arp table.", e);
}
return null;
}
В качестве альтернативы предыдущим ответам решением «без кодирования» является установка эмулятора терминала Linux на вашем устройстве и использование команды arp -a для просмотра таблицы arp.
Похоже, что приложение не могло получить доступ к файлу arp с Android 10. ссылка