2011-09-17 25 views
5

Cuối cùng tôi có thể chạy các lệnh siêu người dùng trong chương trình Android. Bây giờ tôi muốn rsync một vài tập tin từ điện thoại của tôi vào máy tính xách tay của tôi và ở đây có vấn đề. rsync cần mật khẩu để được đưa ra và tôi không hiểu làm thế nào để cung cấp cho mật khẩu của máy tính xách tay của tôi để chương trình Android này. Có nhiều cách mà rsync có thể được thực hiện bằng cách sử dụng khóa riêng tư/công khai. Nhưng những gì tôi muốn nói chung là làm thế nào để tôi ăn đầu vào cho rsync hoặc cho rằng vấn đề bất kỳ lệnh thông qua bàn phím ... Ở đây tôi đang gắn chương trình của tôi ...Rsync trong android

package com.iiitb.nikhil.sindhu; 

import java.io.BufferedReader; 
import java.io.DataInput; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.InputStreamReader; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.LinearLayout; 
import android.widget.TextView; 
import java.util.*; 
import android.util.*; 


public class LinuxShellCommandAndroidProgramActivity extends Activity { 
    /** Called when the activity is first created. */ 

    TextView tv; 
    LinearLayout l; 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     try { 
      Process process = Runtime.getRuntime().exec("/system/bin/su"); 
      DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
      DataInputStream is=new DataInputStream(process.getInputStream()); 
      tv = new TextView(this); 
      os.writeBytes("/system/xbin/rsync /data/data/newfiles [email protected]:/home/sindhu/"); 
      String output=new String(); 
      String temp = new String(); 
      output=is.readLine(); 
      tv.setText(output); 
      os.flush(); 
    } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
    }finally { 
     setContentView(tv); } 

    } 
} 

Ở phía trên tôi đang cố gắng để làm rsync từ điện thoại của tôi đến máy tính xách tay của tôi .. lệnh trên sẽ yêu cầu mật khẩu nhưng tôi không hiểu cách đưa đầu vào cho chương trình android này

+1

chỉ để đảm bảo, 'user: password @ host: port/cách tiếp cận path' không hoạt động, phải không? – denolk

Trả lời

3

nếu rsync yêu cầu mật khẩu (chờ đợi cho người dùng nhập vào), bạn có thể viết nó từ java đến thực hiện proccess ("mô phỏng" bàn phím đầu vào)
như Can Java Runtime.exec another java program that uses stdin?

này là kết quả khi bạn thực hiện rsync trong vỏ android mà không cần bất kỳ đối số

có một -password-file = FILE cờ nhưng tôi không thấy bất kỳ cách trực tiếp nào để đặt mật khẩu

 

# rsync 
rsync version 3.0.6 protocol version 30 
Copyright (C) 1996-2009 by Andrew Tridgell, Wayne Davison, and others. 
Web site: http://rsync.samba.org/ 
Capabilities: 
    64-bit files, 64-bit inums, 32-bit timestamps, 64-bit long ints, 
    no socketpairs, hardlinks, symlinks, IPv6, batchfiles, inplace, 
    append, no ACLs, xattrs, iconv, symtimes 

rsync comes with ABSOLUTELY NO WARRANTY. This is free software, and you 
are welcome to redistribute it under certain conditions. See the GNU 
General Public Licence for details. 

rsync is a file transfer program capable of efficient remote update 
via a fast differencing algorithm. 

Usage: rsync [OPTION]... SRC [SRC]... DEST 
    or rsync [OPTION]... SRC [SRC]... [[email protected]]HOST:DEST 
    or rsync [OPTION]... SRC [SRC]... [[email protected]]HOST::DEST 
    or rsync [OPTION]... SRC [SRC]... rsync://[[email protected]]HOST[:PORT]/DEST 
    or rsync [OPTION]... [[email protected]]HOST:SRC [DEST] 
    or rsync [OPTION]... [[email protected]]HOST::SRC [DEST] 
    or rsync [OPTION]... rsync://[[email protected]]HOST[:PORT]/SRC [DEST] 
The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect 
to an rsync daemon, and require SRC or DEST to start with a module name. 

Options 
-v, --verbose    increase verbosity 
-q, --quiet     suppress non-error messages 
    --no-motd    suppress daemon-mode MOTD (see manpage caveat) 
-c, --checksum    skip based on checksum, not mod-time & size 
-a, --archive    archive mode; equals -rlptgoD (no -H,-A,-X) 
    --no-OPTION    turn off an implied OPTION (e.g. --no-D) 
-r, --recursive    recurse into directories 
-R, --relative    use relative path names 
    --no-implied-dirs  don't send implied dirs with --relative 
-b, --backup    make backups (see --suffix & --backup-dir) 
    --backup-dir=DIR  make backups into hierarchy based in DIR 
    --suffix=SUFFIX   set backup suffix (default ~ w/o --backup-dir) 
-u, --update    skip files that are newer on the receiver 
    --inplace    update destination files in-place (SEE MAN PAGE) 
    --append    append data onto shorter files 
    --append-verify   like --append, but with old data in file checksum 
-d, --dirs     transfer directories without recursing 
-l, --links     copy symlinks as symlinks 
-L, --copy-links   transform symlink into referent file/dir 
    --copy-unsafe-links  only "unsafe" symlinks are transformed 
    --safe-links   ignore symlinks that point outside the source tree 
-k, --copy-dirlinks   transform symlink to a dir into referent dir 
-K, --keep-dirlinks   treat symlinked dir on receiver as dir 
-H, --hard-links   preserve hard links 
-p, --perms     preserve permissions 
-E, --executability   preserve the file's executability 
    --chmod=CHMOD   affect file and/or directory permissions 
-X, --xattrs    preserve extended attributes 
-o, --owner     preserve owner (super-user only) 
-g, --group     preserve group 
    --devices    preserve device files (super-user only) 
    --specials    preserve special files 
-D       same as --devices --specials 
-t, --times     preserve modification times 
-O, --omit-dir-times  omit directories from --times 
    --super     receiver attempts super-user activities 
    --fake-super   store/recover privileged attrs using xattrs 
-S, --sparse    handle sparse files efficiently 
-n, --dry-run    perform a trial run with no changes made 
-W, --whole-file   copy files whole (without delta-xfer algorithm) 
-x, --one-file-system  don't cross filesystem boundaries 
-B, --block-size=SIZE  force a fixed checksum block-size 
-e, --rsh=COMMAND   specify the remote shell to use 
    --rsync-path=PROGRAM specify the rsync to run on the remote machine 
    --existing    skip creating new files on receiver 
    --ignore-existing  skip updating files that already exist on receiver 
    --remove-source-files sender removes synchronized files (non-dirs) 
    --del     an alias for --delete-during 
    --delete    delete extraneous files from destination dirs 
    --delete-before   receiver deletes before transfer, not during 
    --delete-during   receiver deletes during transfer (default) 
    --delete-delay   find deletions during, delete after 
    --delete-after   receiver deletes after transfer, not during 
    --delete-excluded  also delete excluded files from destination dirs 
    --ignore-errors   delete even if there are I/O errors 
    --force     force deletion of directories even if not empty 
    --max-delete=NUM  don't delete more than NUM files 
    --max-size=SIZE   don't transfer any file larger than SIZE 
    --min-size=SIZE   don't transfer any file smaller than SIZE 
    --partial    keep partially transferred files 
    --partial-dir=DIR  put a partially transferred file into DIR 
    --delay-updates   put all updated files into place at transfer's end 
-m, --prune-empty-dirs  prune empty directory chains from the file-list 
    --numeric-ids   don't map uid/gid values by user/group name 
    --timeout=SECONDS  set I/O timeout in seconds 
    --contimeout=SECONDS set daemon connection timeout in seconds 
-I, --ignore-times   don't skip files that match in size and mod-time 
    --size-only    skip files that match in size 
    --modify-window=NUM  compare mod-times with reduced accuracy 
-T, --temp-dir=DIR   create temporary files in directory DIR 
-y, --fuzzy     find similar file for basis if no dest file 
    --compare-dest=DIR  also compare destination files relative to DIR 
    --copy-dest=DIR   ... and include copies of unchanged files 
    --link-dest=DIR   hardlink to files in DIR when unchanged 
-z, --compress    compress file data during the transfer 
    --compress-level=NUM explicitly set compression level 
    --skip-compress=LIST skip compressing files with a suffix in LIST 
-C, --cvs-exclude   auto-ignore files the same way CVS does 
-f, --filter=RULE   add a file-filtering RULE 
-F       same as --filter='dir-merge /.rsync-filter' 
          repeated: --filter='- .rsync-filter' 
    --exclude=PATTERN  exclude files matching PATTERN 
    --exclude-from=FILE  read exclude patterns from FILE 
    --include=PATTERN  don't exclude files matching PATTERN 
    --include-from=FILE  read include patterns from FILE 
    --files-from=FILE  read list of source-file names from FILE 
-0, --from0     all *-from/filter files are delimited by 0s 
-s, --protect-args   no space-splitting; only wildcard special-chars 
    --address=ADDRESS  bind address for outgoing socket to daemon 
    --port=PORT    specify double-colon alternate port number 
    --sockopts=OPTIONS  specify custom TCP options 
    --blocking-io   use blocking I/O for the remote shell 
    --stats     give some file-transfer stats 
-8, --8-bit-output   leave high-bit chars unescaped in output 
-h, --human-readable  output numbers in a human-readable format 
    --progress    show progress during transfer 
-P       same as --partial --progress 
-i, --itemize-changes  output a change-summary for all updates 
    --out-format=FORMAT  output updates using the specified FORMAT 
    --log-file=FILE   log what we're doing to the specified FILE 
    --log-file-format=FMT log updates using the specified FMT 
    --password-file=FILE read daemon-access password from FILE 
    --list-only    list the files instead of copying them 
    --bwlimit=KBPS   limit I/O bandwidth; KBytes per second 
    --write-batch=FILE  write a batched update to FILE 
    --only-write-batch=FILE like --write-batch but w/o updating destination 
    --read-batch=FILE  read a batched update from FILE 
    --protocol=NUM   force an older protocol version to be used 
    --iconv=CONVERT_SPEC request charset conversion of filenames 
-4, --ipv4     prefer IPv4 
-6, --ipv6     prefer IPv6 
    --version    print version number 
(-h) --help     show this help (-h works with no other options) 

Use "rsync --daemon --help" to see the daemon-mode command-line options. 
Please see the rsync(1) and rsyncd.conf(5) man pages for full documentation. 
See http://rsync.samba.org/ for updates, bug reports, and answers 
rsync error: syntax or usage error (code 1) at main.c(1407) [client=3.0.6] 
2

Giả sử bạn có daemon rsync trên máy tính xách tay, bạn có thể sử dụng RSYNC_PASSWORD biến môi trường hoặc tùy chọn --password-file.

Từ trang người đàn ông:

Bạn có thể tránh nhắc mật khẩu bằng cách thiết lập môi trường RSYNC_PASSWORD biến để mật khẩu mà bạn muốn sử dụng hoặc sử dụng tùy chọn --password-file. Điều này có thể hữu ích khi chạy lệnh rsync.

...

--password-file Tùy chọn này cho phép bạn để cung cấp một mật khẩu trong một tập tin để truy cập vào một daemon rsync từ xa. Lưu ý rằng tùy chọn này chỉ hữu ích khi truy cập vào daemon rsync bằng cách sử dụng bộ truyền tải tích hợp, không phải khi sử dụng vỏ từ xa làm phương tiện. Tệp không được là có thể đọc được trên toàn thế giới. Nó chỉ nên chứa mật khẩu dưới dạng một dòng .

2

Như bạn đã đề cập, sử dụng khóa công khai/riêng tư là giải pháp thay thế an toàn và tối ưu. Ngay cả trong Android, thật dễ dàng để thiết lập:

Thông thường bạn có thư mục .ssh trong nhà người dùng, nhưng trong Android bạn có thể không sử dụng được (tùy thuộc vào người dùng đang chạy tập lệnh và Android ứng dụng chạy với tên người dùng khác).

Rsync có dịch vụ riêng nhưng nó thường chỉ được sử dụng với SSH. Bạn có thể sử dụng bất kỳ tham số SSH nào trong Rsync với tùy chọn -e.Trong trường hợp cụ thể của bạn, SSH có tùy chọn -i để chỉ định một khóa riêng để xác thực, trong trường hợp nó hoạt động SSH (và do đó Rsync) sẽ không yêu cầu mật khẩu.

Trong trường hợp của bạn này nên như thế này:

rsync -rltD --no-p -e "ssh -i /path_to_your_private_key" /path_to_local_files_on_android [email protected]:/path_on_remote_server

Sau đó, bạn nên thêm khóa công khai của bạn vào ~/.ssh/authorized_keys2 của máy đích của bạn, trong này dụ/home/user1/.ssh/authorized_keys2/path_to_your_private_key"

Một không an toàn và không tùy chọn khuyến cáo là sử dụng sshpas trực tiếp nhập mật khẩu của bạn:

rsync -rltD --no-p -e "sshpass -p password ssh" /path_to_local_files_on_android [email protected]:/path_on_remote_server

Nhưng tôi không thấy lý do tại sao bạn không nên chọn tùy chọn đầu tiên.

Điều này đang hoạt động với tất cả các tham số SSH. Nếu bạn muốn sử dụng rsync trên cổng khác chỉ cần sử dụng các tùy chọn:

... -e "ssh -p 10022 -i /path_to_your_private_key" ...

Nếu bạn tìm kiếm một cách tổng quát để gửi tổ hợp phím để ứng dụng bạn chạy, điều này không thể xảy ra nếu bạn không có quyền truy cập root và chạy ứng dụng của bạn ở chế độ này. Bạn có thể chạy lệnh với busybox, nhưng nếu busybox không có cách thực hiện để chấp nhận tổ hợp phím, điều này sẽ không thể thực hiện được. Tuy nhiên, bạn có thể gửi một lệnh cụ thể, không yêu cầu tổ hợp phím và đọc chúng từ một tệp cục bộ chẳng hạn, nhưng điều này không hoạt động đối với trường hợp mật khẩu.

Để làm như vậy, bạn có thể sử dụng ký tự "<" sau để chỉ định tệp văn bản có các phím sẽ được chuyển đến ứng dụng. Đây là thay đổi "đầu vào tiêu chuẩn" để đọc từ một tệp cục bộ.

Tuy nhiên, hệ thống có khóa công khai/riêng tư an toàn hơn nhiều!

Các vấn đề liên quan