psi*_*lia 65 linux shell android sh android-ndk
Android shell没有cp命令.Android shell也没有sed或grep或vi.我没有可用的adb守护进程.有mv命令,但如果源是在只读设备上,它拒绝工作.
gnc*_*ais 90
要复制目录,adb pull <remote> <local>
如果要从设备adb push <local> <remote>
复制文件/目录,并将文件/目录复制到设备,似乎可以使用.或者,只是为了复制文件,你可以使用一个简单的技巧:cat source_file > dest_file
.请注意,这不适用于用户不可访问的路径.
要编辑文件,我还没有找到一个简单的解决方案,只是一些可能的解决方法.试试这个,似乎你可以(在设置之后)用它来编辑像这样的文件busybox vi <filename>
.纳米似乎也可以使用.
Vir*_*tvs 32
你可以在没有root权限的情况下完成:
cat srcfile > /mnt/sdcard/dstfile
Run Code Online (Sandbox Code Playgroud)
p_l*_*p_l 16
最常见的答案很简单:用你的APK捆绑几个应用程序(busybox?)(假设你想在应用程序中使用它).据我所知,/ data分区没有安装noexec,即使你不想部署一个完全成熟的APK,你也可以修改ConnectBot源来构建一个包含一组命令行工具的APK.
对于命令行工具,我建议使用crosstool-ng并构建一组静态链接工具(与uClibc链接).他们可能很大,但他们肯定会工作.
由于我的设备上的权限策略有点偏执(不能adb pull
应用数据),所以我编写了一个脚本来递归复制文件。
注意:此递归文件/文件夹复制脚本适用于 Android!
复制-r:
#! /system/bin/sh
src="$1"
dst="$2"
dir0=`pwd`
myfind() {
local fpath=$1
if [ -e "$fpath" ]
then
echo $fpath
if [ -d "$fpath" ]
then
for fn in $fpath/*
do
myfind $fn
done
fi
else
: echo "$fpath not found"
fi
}
if [ ! -z "$dst" ]
then
if [ -d "$src" ]
then
echo 'the source is a directory'
mkdir -p $dst
if [[ "$dst" = /* ]]
then
: # Absolute path
else
# Relative path
dst=`pwd`/$dst
fi
cd $src
echo "COPYING files and directories from `pwd`"
for fn in $(myfind .)
do
if [ -d $fn ]
then
echo "DIR $dst/$fn"
mkdir -p $dst/$fn
else
echo "FILE $dst/$fn"
cat $fn >$dst/$fn
fi
done
echo "DONE"
cd $dir0
elif [ -f "$src" ]
then
echo 'the source is a file'
srcn="${src##*/}"
if [ -z "$srcn" ]
then
srcn="$src"
fi
if [[ "$dst" = */ ]]
then
mkdir -p $dst
echo "copying $src" '->' "$dst/$srcn"
cat $src >$dst/$srcn
elif [ -d "$dst" ]
then
echo "copying $src" '->' "$dst/$srcn"
cat $src >$dst/$srcn
else
dstdir=${dst%/*}
if [ ! -z "$dstdir" ]
then
mkdir -p $dstdir
fi
echo "copying $src" '->' "$dst"
cat $src >$dst
fi
else
echo "$src is neither a file nor a directory"
fi
else
echo "Use: copy-r src-dir dst-dir"
echo "Use: copy-r src-file existing-dst-dir"
echo "Use: copy-r src-file dst-dir/"
echo "Use: copy-r src-file dst-file"
fi
Run Code Online (Sandbox Code Playgroud)
在这里,我提供了 Android 的轻量级源代码,find
因为在某些设备上缺少此实用程序。如果设备上定义了,则myfind
可以使用。find
安装:
$ adb push copy-r /sdcard/
Run Code Online (Sandbox Code Playgroud)
运行在adb shell
(扎根):
# . /sdcard/copy-r files/ /sdcard/files3
Run Code Online (Sandbox Code Playgroud)
或者
# source /sdcard/copy-r files/ /sdcard/files3
Run Code Online (Sandbox Code Playgroud)
(上面的hash#
是su
提示符,而则.
是导致shell运行指定文件的命令,和 几乎一样source
)。
复制后,我可以adb pull
从 SD 卡中获取文件。
将文件写入应用程序目录比较棘手,我尝试对其及其子目录设置读写权限files
,但它不起作用(好吧,它允许我读取,但不能写入,这很奇怪),所以我必须这样做:
String[] cmdline = { "sh", "-c", "source /sdcard/copy-r /sdcard/files4 /data/data/com.example.myapp/files" };
try {
Runtime.getRuntime().exec(cmdline);
} catch (IOException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
在应用程序的onCreate()中。
PS,以防万一有人需要代码来取消应用程序目录的保护,以便adb shell
在未 root 的手机上启用访问,
setRW(appContext.getFilesDir().getParentFile());
public static void setRW(File... files) {
for (File file : files) {
if (file.isDirectory()) {
setRW(file.listFiles()); // Calls same method again.
} else {
}
file.setReadable(true, false);
file.setWritable(true, false);
}
}
Run Code Online (Sandbox Code Playgroud)
尽管由于某种未知的原因我可以读但不能写。