android-command-line-ssh
android-command-line-ssh copied to clipboard
scp failing
I'm running the prebuild binaries on Android KitKat 4.4. They are working great. I've created /data/local/bin on my Android device and placed ssh, scp and sftp in that directory with libssh.so in /system/lib SSH works correctly. I can log into remote machines.
SCP however fails with this error:
$ scp my_file user@remote_ip:/tmp
/data/local/bin/sftp: illegal option -- x
usage: /data/local/bin/sftp [-1246Cpqrv] [-B buffer_size] [-b batchfile] [-c cipher]
[-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit]
[-o ssh_option] [-P port] [-R num_requests] [-S program]
[-s subsystem | sftp_server] host
/data/local/bin/sftp [user@]host[:file ...]
/data/local/bin/sftp [user@]host[:dir[/]]
/data/local/bin/sftp -b batchfile [user@]host
lost connection
I' ve also ran the command with strace. The output is as follow:
execve("/data/local/bin/scp", ["scp", "my_file", "user@remote_ip:/tmp"], [/* 23 vars /]) = 0 mprotect(0x40071000, 4096, PROT_READ) = 0 getrlimit(RLIMIT_STACK, {rlim_cur=81921024, rlim_max=RLIM64_INFINITY}) = 0 gettid() = 22357 set_tls(0x40072f24, 0xffffffb8, 0, 0x40072f24, 0x40073154) = 0 mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0) = 0x40074000 madvise(0x40074000, 8192, 0xc /* MADV_??? /) = -1 EINVAL (Invalid argument) sigaltstack({ss_sp=0x40074000, ss_flags=0, ss_size=8192}, NULL) = 0 sigaction(SIGABRT, {0x40061a91, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0x400ffe7c) = 0 sigaction(SIGBUS, {0x40061a91, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0x400ffe7c) = 0 sigaction(SIGFPE, {0x40061a91, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0x400ffe7c) = 0 sigaction(SIGILL, {0x40061a91, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0x400ffe7c) = 0 sigaction(SIGPIPE, {0x40061a91, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0x400ffe7c) = 0 sigaction(SIGSEGV, {0x40061a91, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0x400ffe7c) = 0 sigaction(SIGSTKFLT, {0x40061a91, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0x400ffe7c) = 0 sigaction(SIGTRAP, {0x40061a91, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, NULL, 0x400ffe7c) = 0 mmap2(NULL, 4092, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0) = 0x40070000 madvise(0x40070000, 4092, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) open("/vendor/lib/libssh.so", O_RDONLY) = -1 ENOENT (No such file or directory) open("/system/lib/libssh.so", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0(�\0\0004\0\0\0"..., 52) = 52 mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40076000 madvise(0x40076000, 4096, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) lseek(3, -8, SEEK_END) = 977482 read(3, "tgroups\0", 8) = 8 mmap2(NULL, 241664, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40077000 madvise(0x40077000, 241664, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x40077000, 229184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x40077000 madvise(0x40077000, 229184, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x400af000, 5128, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x38) = 0x400af000 madvise(0x400af000, 5128, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x400b1000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x400b1000 madvise(0x400b1000, 4096, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) close(3) = 0 munmap(0x40076000, 4096) = 0 open("/vendor/lib/libssl.so", O_RDONLY) = -1 ENOENT (No such file or directory) open("/system/lib/libssl.so", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\0\0\0\0004\0\0\0"..., 52) = 52 mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40076000 madvise(0x40076000, 4096, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) lseek(3, -8, SEEK_END) = 249512 read(3, "\1\0\0\0\0\0\0\0", 8) = 8 mmap2(NULL, 253952, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x400b2000 madvise(0x400b2000, 253952, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x400b2000, 227752, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x400b2000 madvise(0x400b2000, 227752, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x400eb000, 18832, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x38) = 0x400eb000 madvise(0x400eb000, 18832, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) close(3) = 0 munmap(0x40076000, 4096) = 0 open("/vendor/lib/libcrypto.so", O_RDONLY) = -1 ENOENT (No such file or directory) open("/system/lib/libcrypto.so", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\0\0\0\0004\0\0\0"..., 52) = 52 mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40076000 madvise(0x40076000, 4096, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) lseek(3, -8, SEEK_END) = 953260 read(3, "\1\0\0\0\0\0\0\0", 8) = 8 mmap2(NULL, 966656, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x400f0000 madvise(0x400f0000, 966656, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x400f0000, 879836, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x400f0000 madvise(0x400f0000, 879836, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x401c8000, 71312, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xd7) = 0x401c8000 madvise(0x401c8000, 71312, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x401da000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x401da000 madvise(0x401da000, 8192, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) close(3) = 0 munmap(0x40076000, 4096) = 0 open("/vendor/lib/libc.so", O_RDONLY) = -1 ENOENT (No such file or directory) open("/system/lib/libc.so", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\0\0\0\0004\0\0\0"..., 52) = 52 mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40076000 madvise(0x40076000, 4096, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) lseek(3, -8, SEEK_END) = 310648 read(3, "\1\0\0\0\0\0\0\0", 8) = 8 mmap2(NULL, 372736, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x401dc000 madvise(0x401dc000, 372736, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x401dc000, 291812, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x401dc000 madvise(0x401dc000, 291812, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x40224000, 17128, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x47) = 0x40224000 madvise(0x40224000, 17128, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x40229000, 57344, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40229000 madvise(0x40229000, 57344, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) close(3) = 0 munmap(0x40076000, 4096) = 0 mprotect(0x40224000, 8192, PROT_READ) = 0 open("/vendor/lib/libstdc++.so", O_RDONLY) = -1 ENOENT (No such file or directory) open("/system/lib/libstdc++.so", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\0\0\0\0004\0\0\0"..., 52) = 52 mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40076000 madvise(0x40076000, 4096, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) lseek(3, -8, SEEK_END) = 5300 read(3, "\1\0\0\0\0\0\0\0", 8) = 8 mmap2(NULL, 12288, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40237000 madvise(0x40237000, 12288, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x40237000, 2737, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x40237000 madvise(0x40237000, 2737, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x40238000, 4100, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x40238000 madvise(0x40238000, 4100, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) close(3) = 0 munmap(0x40076000, 4096) = 0 mprotect(0x40238000, 4096, PROT_READ) = 0 open("/vendor/lib/libm.so", O_RDONLY) = -1 ENOENT (No such file or directory) open("/system/lib/libm.so", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\0\0\0\0004\0\0\0"..., 52) = 52 mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40076000 madvise(0x40076000, 4096, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) lseek(3, -8, SEEK_END) = 103692 read(3, "\1\0\0\0\0\0\0\0", 8) = 8 mmap2(NULL, 110592, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4023a000 madvise(0x4023a000, 110592, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x4023a000, 98180, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x4023a000 madvise(0x4023a000, 98180, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x40253000, 4204, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x18) = 0x40253000 madvise(0x40253000, 4204, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) close(3) = 0 munmap(0x40076000, 4096) = 0 mprotect(0x40253000, 4096, PROT_READ) = 0 mprotect(0x401c8000, 49152, PROT_READ) = 0 mprotect(0x400eb000, 8192, PROT_READ) = 0 open("/vendor/lib/libz.so", O_RDONLY) = -1 ENOENT (No such file or directory) open("/system/lib/libz.so", O_RDONLY) = 3 read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\0\0\0\0004\0\0\0"..., 52) = 52 mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40076000 madvise(0x40076000, 4096, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) lseek(3, -8, SEEK_END) = 91468 read(3, "\1\0\0\0\0\0\0\0", 8) = 8 mmap2(NULL, 98304, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40255000 madvise(0x40255000, 98304, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x40255000, 89256, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x40255000 madvise(0x40255000, 89256, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) mmap2(0x4026b000, 4160, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x15) = 0x4026b000 madvise(0x4026b000, 4160, 0xc / MADV_??? /) = -1 EINVAL (Invalid argument) close(3) = 0 munmap(0x40076000, 4096) = 0 mprotect(0x4026b000, 4096, PROT_READ) = 0 mprotect(0x40077000, 229376, PROT_READ|PROT_WRITE|PROT_EXEC) = 0 mprotect(0x40077000, 229376, PROT_READ|PROT_EXEC) = 0 mprotect(0x400af000, 4096, PROT_READ) = 0 mprotect(0x10000, 4096, PROT_READ) = 0 open("/dev/properties", O_RDONLY|O_NOFOLLOW) = 3 fcntl64(3, F_SETFD, FD_CLOEXEC) = 0 fstat64(3, {st_mode=S_IFREG|0444, st_size=131072, ...}) = 0 mmap2(NULL, 131072, PROT_READ, MAP_SHARED, 3, 0) = 0x4026d000 close(3) = 0 futex(0x40228540, FUTEX_WAKE_PRIVATE, 2147483647) = 0 mprotect(0x40070000, 4092, PROT_READ|PROT_WRITE) = 0 mprotect(0x40070000, 4092, PROT_READ|PROT_WRITE) = 0 mprotect(0x40070000, 4092, PROT_READ|PROT_WRITE) = 0 mprotect(0x40070000, 4092, PROT_READ|PROT_WRITE) = 0 mprotect(0x40070000, 4092, PROT_READ|PROT_WRITE) = 0 clock_gettime(CLOCK_MONOTONIC, {6655, 656920298}) = 0 mprotect(0x40070000, 4092, PROT_READ|PROT_WRITE) = 0 mprotect(0x40070000, 4092, PROT_READ) = 0 mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40076000 madvise(0x40076000, 4096, 0xc / MADV_??? */) = -1 EINVAL (Invalid argument) mprotect(0x40076000, 4096, PROT_READ) = 0 open("/dev/null", O_RDWR) = 3 close(3) = 0 gettimeofday({1560271283, 31105}, NULL) = 0 brk(0) = 0xdc7000 brk(0xdc7000) = 0xdc7000 brk(0xdc8000) = 0xdc8000 getuid32() = 2000 futex(0x4022a3b0, FUTEX_WAKE_PRIVATE, 2147483647) = 0 ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 sigaction(SIGPIPE, NULL, {0x40061a91, [], SA_RESTART|SA_SIGINFO|SA_ONSTACK}, 0) = 0 sigaction(SIGPIPE, {0xa431, [], 0}, NULL, 0x400ffe7c) = 0 pipe([3, 4]) = 0 pipe([5, 7]) = 0 pipe([8, 11]) = 0 close(3) = 0 close(4) = 0 sigaction(SIGTSTP, NULL, {SIG_DFL, , 0) = 0 sigaction(SIGTSTP, {0xa601, [], 0}, NULL, 0x400ffe7c) = 0 sigaction(SIGTTIN, NULL, {SIG_DFL, , 0) = 0 sigaction(SIGTTIN, {0xa601, [], 0}, NULL, 0x400ffe7c) = 0 sigaction(SIGTTOU, NULL, {SIG_DFL, , 0) = 0 sigaction(SIGTTOU, {0xa601, [], 0}, NULL, 0x400ffe7c) = 0 fork() = 22359 close(5) = 0 close(11) = 0 sigaction(SIGTERM, NULL, {SIG_DFL, , 0) = 0 sigaction(SIGTERM, {0xa461, [], 0}, NULL, 0x400ffe7c) = 0 sigaction(SIGINT, NULL, {SIG_DFL, , 0) = 0 sigaction(SIGINT, {0xa461, [], 0}, NULL, 0x400ffe7c) = 0 sigaction(SIGHUP, NULL, {SIG_DFL, , 0) = 0 sigaction(SIGHUP, {0xa461, [], 0}, NULL, 0x400ffe7c) = 0 read(8, /data/local/bin/sftp: illegal option -- x usage: /data/local/bin/sftp [-1246Cpqrv] [-B buffer_size] [-b batchfile] [-c cipher] [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option] [-P port] [-R num_requests] [-S program] [-s subsystem | sftp_server] host /data/local/bin/sftp [user@]host[:file ...] /data/local/bin/sftp [user@]host[:dir[/]] /data/local/bin/sftp -b batchfile [user@]host "", 1) = 0 write(2, "lost connection\n", 16lost connection ) = 16 --- {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=22359, si_status=1, si_utime=0, si_stime=1} (Child exited) --- mprotect(0x40076000, 4096, PROT_READ|PROT_WRITE) = 0 mprotect(0x40076000, 4096, PROT_READ) = 0 close(0) = 0 close(1) = 0 close(2) = 0 futex(0x40229d74, FUTEX_WAKE_PRIVATE, 2147483647) = 0 munmap(0x40076000, 4096) = 0 exit_group(1) = ?
Glad to hear the code is somewhat useful! However, I'm sorry to report that I haven't kept up with Linux or Android development, so I can't help you debug this issue. I am not familiar with how scp works internally.
Something you could do is replace /data/local/bin/sftp with a shell script that echoed the arguments to stderr and then returned a non-zero exit code. That could help you understand what command line arguments are being sent from scp to sftp. You might even be able to write a sftp script that modified the bad command line arguments and pass a good set of command line arguments on to the real sftp command.