1. 介绍

基于安卓的 ssh 和 rsync 客户端,可用于对服务器指定的目录进行同步到手机。 在这里我们使用 Dropbear 的 dbclient 作为 ssh 的客户端。

Dropbear是一个相对较小的SSH服务器和客户端。 它运行在一个基于POSIX的各种平台。 Dropbear是开源软件,在麻省理工学院式的许可证。 Dropbear是特别有用的“嵌入”式的Linux(或其他Unix)系统,如无线路由器。

2. 准备工作

在使用之前,需要先编译 dropbear 的可执行文件,详细的编译步骤见: BuildingDropbear

或者直接下载已经帮我们编译好的文件: dropbearmulti

rsync 可以到网站上找到相应的文件: Rsync

或者直接下载已经编译好的文件: rsync

3. 如何使用

关键代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
ArrayList<String> list = new ArrayList<String>();
list.add(binDir + "/rsync"); // rsync 的 bin 目录
list.add("-avzO"); // 同步参数
list.add("--progress"); // 显示进度
list.add("-e"); // 用于指定端口,或者 key
list.add(binDir + "/ssh -y -i " + homeDir + "/id_rsa"); // id_rsa 的存放目录
list.add(Config.SERVER); // 同步服务器地址目录,如 admin@wenzhixin.net.cn:~/
list.add(Config.ROOT); // 需要同步到的目录
try {
    ProcessBuilder pb = new ProcessBuilder(list.toArray(new String[] {}));
    pb.directory(binDir);
    Map<String, String> env = pb.environment();
    env.clear();
    env.putAll(System.getenv());
    pb.redirectErrorStream(true);
    Process p = pb.start();

    BufferedReader bis = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line;
    while ((line = bis.readLine()) != null) {
        log(line); // 显示日志
    }
    bis.close();
    p.waitFor();
    p.destroy();
} catch (Exception e) {
    log(e.getMessage());
}

4. 需要注意的问题

1) 如何生成 id_rsa 和 authorized_keys,从而跳过密码的验证

生成 id_rsa,拷贝到手机客户端下:

1
dropbearkey -t rsa -f ~/.ssh/id_rsa

生成 authorized_keys,并拷贝到服务器 ~/.ssh/ 下:

1
dropbearkey -y -f ~/.ssh/id_rsa | grep “^ssh-rsa ” >> authorized_keys

2) 跳过 known_hosts 提示和密码验证

1
ssh -y -i id_rsa
  • -y 表示跳过 known_hosts
  • -i 指定 id_rsa 进行认证