Ich habe ein HTC Desire S, das die Option hat, eine Verbindung über USB herzustellen und die Internetverbindung des Computers zu verwenden. Dies funktioniert gut unter Windows, aber ich habe Probleme, es in Ubuntu einzurichten. Wenn ich das Gerät einstecke und Internet Pass-Through aus dem USB-Menü auswähle, wird das USB1-Gerät erstellt und ich kann seine IP-Adresse anpingen. Ich habe verschiedene iptables-Konfigurationen ausprobiert und nat eingerichtet, aber ich bin mir nicht sicher, ob ich es richtig mache oder ob eine zusätzliche Konfiguration erforderlich ist ...
Danke für jede Hilfe.
Das Folgende funktioniert eine Weile, aber nur für den Browser.
Wenn Sie Ihr Telefon über USB anschließen und Internet Pass-Through auswählen, sollten Sie ein neues RNDIS-Gerät (USB0 oder USB1) erhalten. Bearbeiten Sie für Ubuntu /etc/network/interfaces und fügen Sie die folgenden Zeilen hinzu:
iface usb0 inet dhcp
iface usb1 inet dhcp
Dadurch wird automatisch eine IP zugewiesen, wenn das Gerät hinzugefügt wird. Wenn usb0 oder usb1 nicht automatisch eine Netzwerkadresse zugewiesen wird, müssen Sie dies manuell tun.
Dann müssen Sie NAT auf Ihrem Linux-Computer einrichten. Etwas wie:
sudo iptables -A POSTROUTING -t nat -j MASQUERADE
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
Außerdem benötigen Sie einen DNS-Server:
sudo apt-get install bind9
Dies funktioniert einige Minuten lang, aber nach einer Weile gibt das Telefon die Suche nach HTC Sync auf und trennt die Verbindung.
Sie können sich dauerhaft verbinden, wenn Sie ein gerootetes Telefon haben (fre3vo hat für mich funktioniert). Führen Sie Folgendes mit adb aus.
Aktivieren Sie den USB-Modus für Netzwerk und ADB:
adb shell echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch
Weisen Sie dem USB0-Gerät auf dem Telefon eine IP zu:
adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up
Fügen Sie eine Standardroute hinzu. Die IP sollte die IP sein, die usb0 in Linux zugewiesen ist:
adb shell route add default gw 192.168.99.1 dev usb0
Stellen Sie den DNS-Server ein. Dies ist der offene DNS-Server von Google, aber es kann die IP Ihres Linux-Computers sein, wenn Sie einen DNS-Server haben:
adb shell setprop net.dns1 8.8.8.8
phoneip=$(arp -n | grep usb | awk '{print $1}') echo -n -e "\x00\x02\x00\x00" | nc $phoneip 6000 > /dev/null
Der Hex-Wert von 00 02 00 00
ist alles, wonach gesucht wird.netsh interface ip show config
, um alle Schnittstellennamen anzuzeigen und dann netsh interface ip show config name="Local Area Connection #2"
nur diese Schnittstelle abzurufen, wo Local Area Connection #2
der neue Adapter aufgerufen wird. Sie können dies der Einfachheit halber umbenennen.A hat diese kleine Bash gemacht, um alles zu automatisieren. Schließen Sie einfach Ihr Telefon im Lademodus an Ihren Computer an und führen Sie diese Bash aus.
#!/bin/bash
/opt/android-sdk-update-manager/platform-tools/adb shell 'echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch'
sleep 1
/opt/android-sdk-update-manager/platform-tools/adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up
sleep 1
/opt/android-sdk-update-manager/platform-tools/adb shell setprop net.dns1 8.8.8.8
get_ip ()
{
ifconfig usb0 | grep inet | awk '{print $2}' | sed 's/addr://' | grep .
}
echo "waiting for IP on computer usb0"
while [[ `get_ip` < 192 ]];do sleep 2; done
ip=`get_ip`
echo "IP adress is $ip "
/opt/android-sdk-update-manager/platform-tools/adb shell route add default gw $ip dev usb0
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Da ich selbst keinen Zugriff auf einen Linux-Rechner habe, kann ich diese Lösung nicht testen, aber Sie können die hier beschriebenen Schritte ausprobieren (Google-Übersetzung aus dem Russischen) .
Anmerkungen zur Übersetzung:
Viel Glück!
Ok, hier ist genau das, was ich getan habe, kein Rooten von HTC gewünscht:
Richten Sie bind9 und NAT usw. ein ...
Hinweis: 1: Wenn Sie einfach sudo echo 1 > /proc/sys/net/ipv4/ip_forward ausführen, erhalten Sie einen Berechtigungsfehler. Hier ist also ein Skript für den Prozess. 2: Sie können iptables genauer machen, wie es Dinge tut Hinzufügen von Parametern für bestimmte Geräte.
cd ~
echo '!/bin/bash
apt-get install bind9
iptables -A POSTROUTING -t nat -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward' > setup_bind9_nat.sh
chmod +x setup_bind9_nat.sh
sudo ./setup_bind9_nat.sh
Schließen Sie jetzt Ihr Telefon an und wählen Sie „Internet Pass Through“
Warten Sie, bis das Gerät in angezeigt wird: ifconfig
Überprüfen Sie, ob es auch in ist: arp
Ich habe festgestellt, dass ich das Gerät ausstecken und dann wieder einstecken musste, damit es in arp angezeigt wird. Die Dinge funktionieren nicht richtig, wenn arp das Gerät nicht anzeigt.
Das Gerät wartet dann darauf, dass HTC Sync ihm eine Nachricht sendet, sodass Sie die HTC Sync-Nachricht simulieren müssen:
#change this line to be more specific if you have more than one usb network device
phone_usb_device="usb"
get_ip ()
{
arp -n | grep $phone_usb_device | awk '{print $1}'
}
#TODO: This needs a timeout and loop needs cleaning up, but works fine and borrowed from another post.
echo "waiting for IP on computer usb"
while [[ `get_ip` < 192 ]];do sleep 2; done
phoneip=`get_ip`
echo "IP adress is $phoneip "
echo -n -e "\x00\x02\x00\x00" | nc -q 2 $phoneip 6000 > /dev/null
Ich kann eine Version davon mit D-Bus schreiben, sodass der letzte Teil automatisch ausgeführt wird, wenn das Gerät angeschlossen wird usw. ...
Ok, hier ist meine Arbeit, ich konnte nichts "Generisches" auf d-Bus finden, also habe ich mich für eine Art Hack-Lösung mit udev entschieden. Das ist nicht perfekt, zum Beispiel wird der Befehl zweimal ausgeführt, also ich Ich muss sehen, ob ich die übereinstimmenden Parameter etwas besser filtern kann, auch ein Timeout im letzten Skript hinzufügen, nur für den Fall, und sehen, ob ich arp durch etwas Besseres ersetzen kann, sagen wir, in /proc suchen
here.s meine .rules-Datei aus /etc/udev/rules.d, die ich erstellt habe
cat /etc/udev/rules.d/htc-desire.rules
Du kannst es nennen wie du willst, aber BEGINNE ES NICHT MIT EINER NUMMER, so wird es zuletzt ausgeführt.
Fügen Sie der Datei Folgendes als sudo mit einem Editor Ihrer Wahl usw. hinzu....
#KERNEL=="usb?" or DRIVERS=="usb" not sure which is best, may need extra mode information too from usb device.
SUBSYSTEM=="net", DRIVERS=="usb", ATTRS{manufacturer}=="HTC", ATTRS{idProduct}=="0ffe", RUN+="/home/olli/chain_mock_htc_sync.sh $kernel"
Ubuntu is setup to create the file with the correct permissions already
ls -lrt /etc/udev/rules.d/htc-desire.rules
-rw-r--r-- 1 root root 248 Jun 26 22:09 htc-desire.rules
Grundsätzlich, wenn Sie diese 3 'r's nicht sehen,
sudo chmod a+r /etc/udev/rules.d/htc-desire.rules
Dann brauchen Sie zwei weitere Dateien, eine um die andere zu verketten, da RUN von udev alles andere blockiert (obwohl es zuletzt ausgeführt wird!!) ... hmm ... jedenfalls:
Ich habe die Dateien vorerst in meinem Home-Verzeichnis "/home/olli/" erstellt ... also denken Sie daran, das '/home/olli/'-Bit durch den Ort zu ersetzen, an dem Sie die Dateien erstellen:
Also für mich, cd in mein Home-Verzeichnis.
cd ~
Erstellen Sie eine Datei mit dem Namen
chain_mock_htc_sync.sh
folgendes enthalten:
#!/bin/bash
/home/olli/mock_htc_sync.sh "$1" &
exit
ausführbar machen
chmod +x chain_mock_htc_sync.sh
Erstellen Sie eine weitere Datei mit dem Namen
mock_htc_sync.sh
Folgendes enthalten
#!/bin/bash
#change this line to be more specific if you have more than one usb network device
phone_usb_device="$1"
get_ip ()
{
arp -n | grep $phone_usb_device | awk '{print $1}'
}
#TODO: This needs a timeout and loop needs cleaning up, but works fine and borrowed from another post.
echo "waiting for IP on computer $phone_usb_device"
while [[ `get_ip` /dev/null
Ausführbar machen:
chmod +x mock_htc_sync.sh
Hoffentlich sollte ich bald eine schöne aufgeräumte Version als pos haben. (wahrscheinlich morgen).
Blau grau