camyd
作者camyd·2012-12-18 14:18
数据库管理员·中储粮

手机通过usb自动连接linux电脑上网,传输数据。*需要root* (安卓4升级)

字数 5020阅读 3596评论 1赞 0
htc手机usb连接windows的时候有官方提供的软件可以实现利用电脑上网。其实在linux下也可以,不过功能可能没有windows下完美。

手机能过usb连接电脑传数据,最简单的办法是选”磁盘驱动器“,但是这种连接方法有几个不足:1不能看系统文件,2sd卡得从手机中卸载,很多程序会退出。其实我们可以通过在手机上装sshd服务器,然后通过sftp,ssh连接手机和电脑传数据。简单可靠,功能强大。理论上甚至可以刷系统(不推荐用,弄坏不负责)。

下面介绍如何实现手机通过linux系统上网:(比较罗嗦,不想知道原理的可以直接看最后)
原理上手机通过电脑上网是很简单的, 只要激活手机里的usb网卡并,适当地设置网址和网络就可以了。


激活手机里的usb网卡有两种办法:
1. 连手机时选internet共享或internet传输。这个的不足之处是,internet共享要求手机能上网; internet传输手机会搜索电脑端的软件,linux下没有这软件,所以在几分钟后连接就会被关掉。因而这些办法没有实用价值。
2. 获得手机的root权限,自己手动激活。方法很简单:只要在手机的命令行终端里输入:
  1. #手机里运行
  2. echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch
复制代码
这样激活的usb网卡简单可靠,不足之处是,这个命令要有root权限才起作用。


激活usb网卡之后(其实激活的网卡是一对,手机的网卡,和电脑端的网卡(虽然这个网卡也在手机里)),先设置电脑端的网址:
  1. #电脑上运行
  2. ifconfig usb0 192.168.99.1 netmask 255.255.255.0 up
复制代码
这里要注意,如果你的电脑里有network-manager,你可以通过它设置网址,就不用这个命令了。我的建议是让network-manager不要接管这个设备,方法是在/etc/network/interfaces里添加两行:
  1. #添加到电脑里的文件/etc/network/interfaces
  2. allow-hotplug usb0
  3. iface usb0 inet static
复制代码
接下来设置手机里的网卡:
  1. #手机里运行
  2. ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up
  3. route add default gw 192.168.99.1 dev usb0
  4. setprop net.dns1 8.8.8.8
复制代码
这样手机网卡设置完毕。这里要注意的是第三行dns服务器的网址,可能要根据所在的网络修改,如果有特殊要求,应该尝试设置跟电脑同一个dns地址。

至此,手机跟电脑的网络连接已经打通,理论上他们之间已经可以互相传数据。当然要真正传文件,电脑和手机必需有数据服务器和终端。比如ftp,或sftp。这里我推荐,在手机上装ssh服务,这样就可以在电脑端操作传数据。这样更方便。而且ssh连接还可以实现通过电脑登录手机。手机上的ssh服务,我推荐quicksshd很简单,软件里面有帮助。这里就不细说了。电脑端只要用一个带sftp功能的文件管理器(比如dolphin)就可以了。

到这里手机跟电脑的数据传输设置完成。

要让手机能够通过电脑上网只要在电脑上设置一下数据转发就可以了:
  1. #电脑里运行可以放在/etc/rc.local里
  2. echo 1 >/proc/sys/net/ipv4/ip_forward
  3. iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -o eth0 -j SNAT --to xxx.xxx.xxx.xxx #请把xxx.xxx.xxx.xxx换成电脑的ip。
复制代码

到这里手机和电脑之间传数据和手机通过电脑上网都完成了。
过程看着很罗嗦。

不过下面我要再罗嗦几句,关于这些过程的简化和优化:
关于在手机里输命令,要么得在手机里装个字符终端,要么打开手机的usb调试,用adb命令在电脑端发送。用手机字符终端的话可以把手机命令写在文件里,放在/data/local/bin里,设为可执行。用usb调试的话,可以把所有命令都写在电脑端,运行会更简单。还可以通过udev控制自动运行命令。


下面总结执行步骤:
手机端:
1. 获取root权限,可参考如何解锁手机(unlock bootloader),如何一键获取root权限。
2. 打开usb调试,所有设置->应用程序->开发。
3. 装quicksshd。并设置,启动服务。(见附件)

电脑端:
1. 把
  1. echo 1 >/proc/sys/net/ipv4/ip_forward
  2. iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -o eth0 -j SNAT --to xxx.xxx.xxx.xxx  #把xxx.xxx.xxx.xxx换成电脑的上网ip。
复制代码
运行一遍并添加到/etc/rc.local里,在exit之前。
2. 把
  1. #!/bin/sh
  2. /sbin/ifconfig -a | grep -q usb0 && exit
  3. (
  4. sleep 2
  5. ADB=/usr/local/bin/adb
  6. $ADB shell 'su -c "echo 6 > /sys/devices/platform/msm_hsusb/usb_function_switch"'
  7. sleep 2
  8. ifconfig usb0 192.168.99.1 netmask 255.255.255.0 up
  9. $ADB shell 'su -c "ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up; route add default gw 192.168.99.1 dev usb0; setprop net.dns1 8.8.8.8"'  #如果需要的话,把8.8.8.8改成自己用的dns服务器
  10. )&
  11. exit
复制代码
存成/usr/local/bin/rev-connect,设置为可执行。
====新改动====
1.+2.合并为/usr/local/bin/rev-connect: 自动获取系统的ip和dns服务器。安卓4的切usb功能路径有改动。
  1. #!/bin/bash
  2. /sbin/ifconfig -a | grep -q usb0 && exit
  3. mkdir /tmp/.phone || exit
  4. read dns1 dns2 dnsX< <(awk '/^nameserver/{printf "%s ", $2}' /etc/resolv.conf)
  5. if [ "$dns1"x == x ]
  6. then
  7.         dns1=`route -n |awk '/^0.0.0.0/{printf "%s",$2}'`
  8. fi
  9. if [ "$dns2"x == x ]
  10. then
  11.         dns2=$dns1
  12. fi
  13. read interface address xx< <(/sbin/ifconfig |awk -v RS='nn'  '/^(ppp|eth|wlan).*inet addr/{split($0,line,"n");printf ("%s ", $1);for (x in line){if (match(line[x],"inet addr")){split(line[x],addr,":| +");printf ("%s", addr[4]);}}}')
  14. iptables -t nat -F
  15. iptables -t nat -A POSTROUTING -s 192.168.99.0/24 -o $interface -j SNAT --to $address
  16. echo 1 > /proc/sys/net/ipv4/ip_forward
  17. sleep 1
  18. ADB=/usr/local/bin/adb
  19. $ADB shell 'su -c "echo 6 > /sys/devices/platform/android_usb/usb_function_switch"'
  20. sleep 1
  21. ifconfig usb0 192.168.99.1 netmask 255.255.255.0 up
  22. $ADB shell 'su -c "ifconfig usb0 192.168.99.5 netmask 255.255.255.0 up; route add default gw 192.168.99.1 dev usb0; setprop net.dns1 '$dns1'; setprop net.dns2 '$dns2'"'
  23. rmdir /tmp/.phone
  24. exit
复制代码
====新改动结束====

3. 把linux版的adb存到/usr/local/bin下,设置为可执行。(见附件)
4. 把
  1. SUBSYSTEMS=="usb", ATTRS{idVendor}=="0bb4", ACTION=="add", RUN+="/usr/local/bin/rev-connect"
复制代码
存成/etc/udev/rules.d/90-htcphone.rules .说明,这里的0bb4可能要改,可以用命令lsusb查到,htc手机的芯片都是这个号,如果不是htc手机,根据lsusb的输出自己改一下。
比如:
$lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 004: ID 0bb4:0ffc HTC (High Tech Computer Corp.)

5. 把
  1. #添加到电脑里的文件/etc/network/interfaces
  2. allow-hotplug usb0
  3. iface usb0 inet static
复制代码
添加到/etc/network/interfaces里,加进去之后运行 /etc/init.d/network-manager restart,防止network-manager接管这个设备。

至此,大功告成。每次手机一通过usb跟电脑连接,不用任何操作,几秒钟之后,手机就可以通过电脑上网。电脑可以通过ssh root@192.168.99.5,或sftp root@192.168.99.5访问手机。只要把连接地址设置好存下,以后连手机就跟打开一个目录一样简单。

第一次发贴,大家支持一下啊。

忘了说了,这样上网不能到市场里下软件,也不能用sype。因为他们检查无线网络或手机网络之后会认为没有网络连接,拒绝工作。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论1 条评论

wushuangriwushuangri工程师fivefu
2012-12-18 16:03
good job!
Ctrl+Enter 发表

作者其他文章

X社区推广