2011-09-17 9 views
5

Finalmente puedo ejecutar comandos de superusuario en el programa de Android. Ahora quiero sincronizar algunos archivos desde mi teléfono a mi computadora portátil y aquí viene el problema. rsync necesita que se proporcione la contraseña y no entiendo cómo dar la contraseña de mi computadora portátil a este programa de Android. Hay formas en que rsync se puede hacer usando claves privadas/públicas. Pero lo que quiero es que, en general, ¿Cómo alimento entrada a rsync o para el caso cualquier comando a través del teclado ... Aquí estoy adjuntando mi programa ...Rsync en 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); } 

    } 
} 

En lo anterior que estoy tratando de hacer rsync desde mi teléfono a mi computadora portátil ... el comando anterior me pediría la contraseña pero no entiendo cómo dar entrada a este programa de Android

+1

sólo para estar seguro, 'de usuario: contraseña @ host: puerto aproximación/path' no funciona, ¿verdad? – denolk

Respuesta

3

si rsync pide la contraseña (en espera de la entrada del usuario) se puede escribir de Java a la ejecutar proccess ("simular" la entrada de teclado)
como Can Java Runtime.exec another java program that uses stdin?

ésta es la salida al ejecutar rsync con cáscara androide sin argumentos

hay un -password-file = aRCHIVO bandera pero ¿no ven ninguna manera directa para establecer la contraseña

 

# 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

Suponiendo que tiene un daemon rsync en su computadora portátil, puede usar el RSYNC_PASSWORD variable de entorno o --password-file opción.

Desde la página del manual:

Usted puede evitar la solicitud de contraseña mediante el establecimiento del entorno RSYNC_PASSWORD variable para la contraseña que desea usar o usar la opción --password -archivo. Esto puede ser útil al crear scripts de rsync.

...

--password-archivo Esta opción le permite proporcionar una contraseña en un archivo para acceder a un demonio rsync remoto. Tenga en cuenta que esta opción solo es útil al cuando se accede a un daemon rsync utilizando el transporte integrado, no a cuando se utiliza un shell remoto como medio de transporte. El archivo no debe ser legible por todo el mundo. Debe contener solo la contraseña como una sola línea .

2

Como usted menciona, utilizando la clave pública/privada es una alternativa, pero esta es la opción más segura y óptima. Incluso en Android es fácil de configurar:

Normalmente tiene una carpeta .ssh en el hogar del usuario, pero en Android no puede usarla (depende del usuario que ejecuta el script, y en Android cada la aplicación se ejecuta con otro nombre de usuario).

Rsync tiene su propio servicio pero se usa comúnmente solo con SSH. Puede usar cualquier parámetro SSH en Rsync con la opción -e.En su caso particular, SSH tiene la opción -i para especificar una clave privada para autenticarse, en caso de que funcione SSH (y por lo tanto Rsync) no solicitará la contraseña.

En su caso esto debe ser así:

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

entonces debería agregar su clave pública al ~/.ssh/authorized_keys2 de la máquina de destino, en este ejemplo/home/user1/.ssh/authorized_keys2/path_to_your_private_key"

Otra inseguro y NO opción recomendada está utilizando sshpas para introducir directamente la contraseña:

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

Pero no veo la razón por la que no deba elegir la primera opción.

Esto funciona por cierto con todos los parámetros SSH. Si desea utilizar Rsync en otro puerto sólo tiene que utilizar la opción:

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

Si usted busca una manera general, a enviar pulsaciones de teclas a las aplicaciones que se ejecuta, esto no es posible si usted no tiene acceso a la raíz y ejecuta tu aplicación en este modo. Puede ejecutar el comando con busybox, pero si busybox no tiene una forma implementada de aceptar pulsaciones de teclas, esto no será posible. Aunque puede enviar un comando específico, que no requiera pulsaciones de teclas y leerlas desde un archivo local, por ejemplo, pero esto no funciona en el caso de las contraseñas.

Para hacerlo, puede utilizar el carácter "<" después del comando para especificar un archivo de texto con las claves que se pasarán a la aplicación. Esto es cambiar la "entrada estándar" para leer desde un archivo local.

Sin embargo, el sistema con clave pública/privada es mucho más seguro.