在ROOT环境下 基于命令进行VPN pptp 拨号器开发
来源:互联网 发布:enrique iglesias 知乎 编辑:程序博客网 时间:2024/06/05 23:52
VPN拨号器
项目需求 需要进行IP 地址 切换 需要用到VPN 还不能用原生的只能自己开发 差了大量的资料的都很坑 VPN API 被隐藏需要暴力反射获取 等等 超级麻烦 最后发现 在ROOT环境下用命令 可以进行 pptp拨号 核心命令就是四条
private Thread IP_3; //声明一个子线程 private Thread IP_2; private Thread IP_1; private Thread VPN_IP; //private TextView it_ip; // private EditText it_ip; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // EditText it_ip= (EditText) findViewById(R.id.it_ip); // it_ip.setText(getLocalHostIp()); final String vpn_ip=getLocalHostIp(); // String ip138=GetNetIp(); VPN_IP=new Thread(new Runnable() { @Override public void run() { while (true){ try { VPN_IP.sleep(15000); } catch (InterruptedException e) { e.printStackTrace(); } if (vpn_ip.equals("0.0.0.0")){ book(); System.out.println("VPN---已断开重新连接中"); }else { System.out.println("VPN---连接中"+vpn_ip); } } } }); VPN_IP.start(); } @Override protected void onStart() { super.onStart(); book(); } public String execShell(String cmd){ try{ //权限设置 Process p = Runtime.getRuntime().exec("su"); //开始执行shell脚本 //获取输出流 OutputStream outputStream = p.getOutputStream(); DataOutputStream dataOutputStream=new DataOutputStream(outputStream); //将命令写入 dataOutputStream.writeBytes(cmd); //提交命令 dataOutputStream.flush(); //关闭流操作 dataOutputStream.close(); outputStream.close(); } catch(Throwable t) { t.printStackTrace(); } return cmd; } private void book(){ IP_1 = new Thread(new Runnable() { @Override public void run() { //这里写入子线程需要做的工作 try { IP_1.sleep(1000); // 自己服务器的地址 name 账号 password 密码 execShell("mtpd wlan0 pptp 111.1.1.1 1723 name abc password 123456 linkname vpn nodefaultroute mtu 1396 mru 1396 +mppe unit 100"); Looper.prepare(); Toast.makeText(MainActivity.this,"开启VPN",Toast.LENGTH_SHORT).show(); // System.out.println("激活命令"); Looper.loop(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); IP_1.start(); //启动线程 IP_2 = new Thread(new Runnable() { public void run() { try { IP_2.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 设置IP出口 自定义网卡名称 execShell("ip -4 ro flush dev ppp100"); Looper.prepare(); Toast.makeText(MainActivity.this,"激活命令---1",Toast.LENGTH_SHORT).show(); // System.out.println("激活命令"); Looper.loop(); }; }); IP_2.start(); IP_3 = new Thread(new Runnable() { @Override public void run() { //这里写入子线程需要做的工作 try { IP_3.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } execShell("ip ro add 0.0.0.0/1 dev ppp100"); Looper.prepare(); Toast.makeText(MainActivity.this,"激活最终命令",Toast.LENGTH_SHORT).show(); // System.out.println("激活命令"); Looper.loop(); } }); IP_3.start(); //启动线程} // 得到本机ip地址 public String getLocalHostIp() { String ipaddress = ""; try { Enumeration<NetworkInterface> en = NetworkInterface .getNetworkInterfaces(); // 遍历所用的网络接口 while (en.hasMoreElements()) { NetworkInterface nif = en.nextElement();// 得到每一个网络接口绑定的所有ip Enumeration<InetAddress> inet = nif.getInetAddresses(); // 遍历每一个接口绑定的所有ip while (inet.hasMoreElements()) { InetAddress ip = inet.nextElement(); if (!ip.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ip .getHostAddress())) { return ipaddress = "本机的ip是" + ":" + ip.getHostAddress(); } } } } catch (SocketException e) { Log.e("feige", "获取本地ip地址失败"); e.printStackTrace(); } return ipaddress; } @Override protected void onStop() { super.onStop(); execShell("settings put global airplane_mode_on 1"); execShell("am broadcast -a android.intent.action.AIRPLANE_MODE –ez state true"); System.out.println("结束---VPN");/* execShell("settings put global airplane_mode_on 1"); execShell("am broadcast -a android.intent.action.AIRPLANE_MODE –ez state true"); execShell("settings put global airplane_mode_on 0"); execShell("am broadcast -a android.intent.action.AIRPLANE_MODE –ez state false");*/ }
整段代码复制就行 已经成功拨号 整段代码的逻辑就是 拨号成功后进行检测当前IP 地址 检测到VPN掉了 重新进行拨号
最后CSDN 还有一篇pptp 拨号文章可以看看他的 http://blog.csdn.net/oo_oo_/article/details/50152731
0 0
- 在ROOT环境下 基于命令进行VPN pptp 拨号器开发
- ubuntu下用pptp客户端进行VPN拨号
- 在centos6.2x64下基于pptp配置vpn server
- 使用命令行进行PPTP VPN拨号(连通后的配置)
- centos 6.8命令行下进行pptp拨号
- Linux下PPTP的VPN拨号设置(客户端)
- Linux下PPTP的VPN拨号设置(客户端)
- ubuntu下建立PPTP-VPN客户端拨号连接 [已删除]
- ubuntu下建立PPTP-VPN客户端拨号连接
- ubuntu下建立PPTP-VPN客户端拨号连接(绝对可用)
- centos5.5下简历vpn服务器(基于PPTP)aws环境
- 如何在Ubuntu下配置PPTP VPN
- 案例1:ADSL拨号环境下基于Windows Server 2003的VPN方案设计
- [Android] PPTP VPN客户端拨号操作步骤
- CentOS 7 配置 VPN 拨号(PPTP)
- 如何在AWS(基于Amazon Linux)上搭建PPTP VPN
- CentOS 下配置pptp vpn client 连接 pptp vpn Server
- [Windows 7] PPTP VPN客户端拨号操作步骤
- SQL Server 手把手教你使用profile进行性能监控
- Caffe + Ubuntu 15.04(16.04) + CUDA 7.5(8) 新手安装配置指南
- d3js制作中国地图
- Spring Boot 学习(一)入门及使用
- 105. Construct Binary Tree from Preorder and Inorder Traversal
- 在ROOT环境下 基于命令进行VPN pptp 拨号器开发
- 两分钟实现安全完备的登录模块
- android仿淘宝详情页面viewPager滑动到最后一张图片跳转的功能
- DOS 下常用的操作命令
- Simplify Path
- Java学习记录--初识java
- 嵌入式Linux菜鸟成长记(八)
- base.css
- 怎样将成员函数指针强制转换成void*指针?