2011-09-17 12 views
5

Finalmente sono in grado di eseguire i comandi di super utente nel programma Android. Ora voglio rsync alcuni file dal mio telefono al mio portatile e qui arriva il problema. rsync ha bisogno di password e non sto capendo come dare la password del mio portatile a questo programma Android. Ci sono modi in cui rsync può essere fatto usando chiavi private/pubbliche. Ma quello che voglio, in generale, è che come faccio da mangiare input per rsync o per quella materia qualsiasi comando tramite tastiera ... Qui Vi allego il mio programma ...Rsync in 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); } 

    } 
} 

In quanto sopra che sto cercando di fare rsync dal mio telefono al mio portatile..il comando sopra chiederebbe la password ma non sto capendo come dare input a questo programma Android

+1

solo per essere sicuri, 'utente: password @ host: port/approccio path' non funziona, giusto? – denolk

risposta

3

se rsync chiede la password (in attesa di input dell'utente) è possibile scrivere da Java al esecuzione proccess ("simulando" input da tastiera)
come Can Java Runtime.exec another java program that uses stdin?

questo è l'output quando si esegue rsync in guscio Android senza alcun argomento

c'è un -password-file = fILE bandiera ma io Non vedo alcun modo diretto per impostare la password

 

# 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

Supponendo di avere un demone rsync sul tuo laptop, puoi usare il RSYNC_PASSWORD variabile di ambiente o l'opzione --password-file.

Dalla pagina man:

È possibile evitare la richiesta di password impostando l'ambiente RSYNC_PASSWORD variabile la password che si desidera utilizzare o utilizzando l'opzione --password-file di. Questo può essere utile quando si esegue lo scripting di rsync.

...

--password-file di Questa opzione consente di fornire una password in un file per l'accesso a un demone rsync remota. Si noti che questa opzione è utile solo quando si accede a un daemon rsync utilizzando il trasporto integrato, non quando si utilizza una shell remota come trasporto. Il file non deve essere leggibile nel mondo . Dovrebbe contenere solo la password come singola linea .

2

Come si parla, utilizzando la chiave pubblica/privata è un'alternativa, ma questa è l'opzione più sicura ed ottimale. Anche in Android è facile da configurare:

Di solito si ha una cartella .ssh nella home dell'utente, ma in Android potresti non essere in grado di usarlo (dipende dall'utente che esegue lo script e in Android ogni l'app viene eseguita con un altro nome utente).

Rsync ha il proprio servizio ma è comunemente usato solo con SSH. È possibile utilizzare qualsiasi parametro SSH in Rsync con l'opzione -e.Nel tuo caso particolare, SSH ha l'opzione -i per specificare una chiave privata da autenticare, nel caso in cui funzioni SSH (e quindi Rsync) non chiederà la password.

Nel tuo caso questo dovrebbe essere simile a questo:

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

allora si dovrebbe aggiungere la vostra chiave pubblica al ~/.ssh/authorized_keys2 della vostra macchina di destinazione, in questo esempio/home/user1/.ssh/authorized_keys2/path_to_your_private_key"

Un altro pericoloso e NON opzione consigliata sta usando sshpas per inserire direttamente la password:

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

Ma non vedo il motivo per cui non si dovrebbe scegliere la prima opzione.

Questo funziona con tutti i parametri SSH. Se si desidera utilizzare Rsync su un'altra porta basta usare l'opzione:

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

Se cercate un modo generale di inviare sequenze di tasti alle applicazioni si esegue, questo non è possibile se non si dispone di accesso root ed esegui la tua app in questa modalità. È possibile eseguire il comando con busybox, ma se busybox non ha un modo implementato per accettare le sequenze di tasti questo non sarà possibile. È possibile però inviare un comando specifico, non richiedendo sequenze di tasti e leggerli da un file locale, ad esempio, ma questo non funziona sul caso delle password.

Per fare ciò è possibile utilizzare il carattere "<" dopo il comando per specificare un file di testo con le chiavi che verranno passate all'app. Questa è la modifica dello "standard input" per leggere da un file locale.

Tuttavia, il sistema con chiave pubblica/privata è molto più sicuro!