我有一个HTC Desire S,可以选择通过USB连接并使用计算机的Internet连接。这在Windows上可以正常工作,但是我正在努力在Ubuntu中进行设置。当我插入电源并从usb菜单中选择Internet pass-through时,就会创建usb1设备,并且可以ping它的ip地址。我已经尝试了各种iptables配置并设置了nat,但是我不确定自己是否做对了,或者是否需要其他配置...
谢谢你的帮助。
我有一个HTC Desire S,可以选择通过USB连接并使用计算机的Internet连接。这在Windows上可以正常工作,但是我正在努力在Ubuntu中进行设置。当我插入电源并从usb菜单中选择Internet pass-through时,就会创建usb1设备,并且可以ping它的ip地址。我已经尝试了各种iptables配置并设置了nat,但是我不确定自己是否做对了,或者是否需要其他配置...
谢谢你的帮助。
Answers:
以下内容可以使用一段时间,但仅适用于浏览器。
通过usb插入电话并选择Internet pass-through时,您应该获得一个新的RNDIS设备(usb0或usb1)。对于ubuntu,编辑/ etc / network / interfaces并添加以下行:
iface usb0 inet dhcp
iface usb1 inet dhcp
添加设备后,这将自动分配IP。如果未将网络地址自动分配给usb0或usb1,则必须手动进行操作。
然后,您需要在Linux计算机上设置NAT。就像是:
sudo iptables -A POSTROUTING -t nat -j MASQUERADE
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
您还需要一个DNS服务器:
sudo apt-get install bind9
这可以工作几分钟,但过一会儿电话会放弃寻找HTC Sync并断开连接。
如果您的手机已扎根,则可以永久连接(fre3vo对我有用)。使用adb执行以下操作。
为网络和ADB启用USB模式:
adb shell echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch
为电话上的usb0设备分配IP:
adb shell ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up
添加默认路由。该IP应该是在Linux中分配给usb0的IP:
adb shell route add default gw 192.168.99.1 dev usb0
设置DNS服务器。这是Google的开放式DNS服务器,但如果您有DNS服务器,则它可以是Linux计算机的IP:
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
的十六进制值00 02 00 00
就是它要查找的全部。
netsh interface ip show config
以查看所有接口名称,然后netsh interface ip show config name="Local Area Connection #2"
仅获取该接口,Local Area Connection #2
新适配器被称为何处。为了方便起见,您可以重命名。
一个使这个小bash自动化。只需将手机以充电模式插入计算机,然后运行此bash。
#!/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
由于我自己没有使用Linux机器的权限,因此无法测试此解决方案,但是您可以尝试此处描述 的步骤(来自俄语的Google翻译)。
翻译评论:
祝好运!
好的,这正是我所做的,不需要HTC扎根:
设置bind9和NAT等...
注意:1:如果只执行sudo echo 1> / proc / sys / net / ipv4 / ip_forward,则会出现权限错误,因此这是该过程的脚本2:您可以通过以下方式使iptables更具体地进行处理:为特定设备添加参数。
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
现在插入电话,然后选择“互联网通过”
等待设备出现在:
ifconfig
检查设备
是否也在:
arp
我发现必须拔出设备的电源,然后再次插入才能使它出现在arp中,如果arp未显示该设备,则说明该设备无法正常工作。
然后,设备将等待HTC Sync向其发送消息,因此您必须模拟HTC Syncs消息:
#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
我可能会使用D-Bus编写此版本,因此当插入设备等时,后者会自动执行。
好的,这是我正在进行的工作,我在d-bus上找不到任何“通用”的东西,因此我选择了使用udev的一些hack解决方案。这不是完美的,例如命令被运行了两次,所以我'必须看看我是否可以更好地过滤匹配的参数,还要在最后一个脚本上添加一个超时,以防万一,看看我是否可以将arp替换为更好的东西,例如查看/ proc
这是我从/etc/udev/rules.d创建的.rules文件
cat /etc/udev/rules.d/htc-desire.rules
您可以随意调用它,但不要以数字开头,这样它才能最终运行。
使用您选择的编辑器将以下内容作为sudo添加到文件中...
#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
基本上,如果您没有看到这3个“ r”,
sudo chmod a+r /etc/udev/rules.d/htc-desire.rules
然后,您将需要另外两个文件,一个要链接另一个文件,因为udev的RUN会阻止其他所有文件(即使最后运行!)……嗯……无论如何:
我现在在主目录中创建了“ / home / olli /”文件,因此请记住将“ / home / olli /”位替换为创建文件的位置:
所以对我来说,cd到我的主目录。
cd ~
创建一个名为
chain_mock_htc_sync.sh
包含以下内容:
#!/bin/bash
/home/olli/mock_htc_sync.sh "$1" &
exit
使它可执行
chmod +x chain_mock_htc_sync.sh
创建另一个名为
mock_htc_sync.sh
包含以下内容
#!/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
使它可执行:
chmod +x mock_htc_sync.sh
希望我尽快在pos上有一个很好的整理版本。(大概是明天)。