脚本的具体输入较少

脚本的具体输入较少

前段时间,当我正在寻找一种方法来找出可以从 Android ROM 中删除哪些内容而不影响我使用的功能时,我deptreexda forums.由于这是 2012 年写的,因此无法按预期工作。更新使用的工具(dex2jarsmali...)加上对脚本的一些细微更改(例如将文件夹更改为Android现在使用的文件夹,例如),system/app-private然后system/priv-app/*/我再次运行它。
部分魔法发生在与此类似的三个脚本中:

while [ -n "$1" ]; do
    for bin in "$1"/*; do
        [ -f "$bin" ] || continue
        case "$bin" in
            *.so)
            ;;
            *)
            [ -x "$bin" ] || continue
            ;;
        esac
        "$FILE_DIR/perls/parse_bin.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_bin.log"
    done
shift
done

通过利用我从未学过编码的超能力,我总结出这里会发生以下事情(如果我有什么问题,你可以纠正我):

  1. 访问输入文件夹时$1
  2. 每个bin(ary)文件都会得到
  3. 检查它是否真的是一个binary文件,如果是的话,
    (我不知道代表什么||
  4. 它检查扩展名(.sonone)并且
  5. 使用找到的文件(*.so以及没有扩展名的文件)作为脚本的输入parse_bin.pl

输入文件夹必须非常具体,对于这个脚本来说,这些是

$ACTIVE_DB/rom/system/lib $ACTIVE_DB/rom/system/lib/*/ $ACTIVE_DB/rom/system/usr/lib you get how this continues, super long list of folders

我想知道的是,我必须如何修改这三个脚本以便输入文件夹是$ACTIVE_DB/rom/system

编辑:在输入文件夹中查找文件的机制在所有三个脚本中都是相同的,除了其他两个脚本正在搜索*.jar*.apk

EDIT2:bash外壳被用来运行这个

我知道这必须发生在脚本的前两行中,我已经尝试过fromnaboo答案这里它会吐出文件夹内的每个二进制文件$ACTIVE_DB/rom,但不会将它们作为输入传递给parse_bin.pl.

请有日志:

+ PARSE_BIN DB_45763/rom/system
+ '[' -n DB_45763/rom/system ']'
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/CSCVersion.txt ']'
+ case "$bin" in
+ '[' -x DB_45763/rom/system/CSCVersion.txt ']'
+ printf 'DB_45763/rom/system/CSCVersion.txt:\t'
+ echo DB_45763/rom/system/CSCVersion.txt
+ ./files/perls/parse_bin.pl DB_45763/rom/system/CSCVersion.txt dbi:SQLite:dbname=DB_45763/test.sqlite
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/app ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/bin ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/build.prop ']'
+ case "$bin" in
+ '[' -x DB_45763/rom/system/build.prop ']'
+ printf 'DB_45763/rom/system/build.prop:\t'
+ echo DB_45763/rom/system/build.prop
+ ./files/perls/parse_bin.pl DB_45763/rom/system/build.prop dbi:SQLite:dbname=DB_45763/test.sqlite
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/cameradata ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/csc ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/csc_contents ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/etc ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/fonts ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/framework ']'
+ continue
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/kern_sec_info ']'
+ case "$bin" in
+ '[' -x DB_45763/rom/system/kern_sec_info ']'
+ printf 'DB_45763/rom/system/kern_sec_info:\t'
+ echo DB_45763/rom/system/kern_sec_info
+ ./files/perls/parse_bin.pl DB_45763/rom/system/kern_sec_info dbi:SQLite:dbname=DB_45763/test.sqlite
+ for bin in '"$1"/*'
+ '[' -f DB_45763/rom/system/lib ']'
+ continue
+ shift
+ '[' -n '' ']'

答案1

首先,您对脚本功能的假设似乎是正确的。它会查看在 中找到的所有文件、文件夹、符号链接等$1,如果它是文件,则它会更深入地确定它是库还是可执行文件。

在 shell 脚本中,$1这是传递给脚本的第一个参数,因此要$ACTIVE_DB/rom/system在您的位置运行此脚本$1,只需使用

./scriptname $ACTIVE_DB/rom/system

注意:如果您从命令提示符调用此命令,$ACTIVE则必须替换实际路径。

为了使该脚本递归地下降到目标目录中,您可以尝试将其添加到脚本中

while [ -n "$1" ]; do
    # use globbing to descend into all subdirectories
    for bin in $(find "$1" | tr '\n' ' '); do
    # change this  ^^^^   
        [ -f "$bin" ] || continue
        # leave the rest of the script as is
        # ....

答案2

因此,如果有人想知道我做了什么,这是目前的代码。
感谢@the_velour_fog 帮助我。
如果有人认为这是最糟糕的解决方案
(我也不认为它超级性感,但它做了它必须做的事情),请把他们带到这里。

    while [ -n "$1" ]; do
    for bin in $(find "$1"); do
        [ -f "$bin" ] || continue
        case "$bin" in
            *.so)
                export start=$(date +"%T")
                printf "$bin:\t"
                echo -n "$start  " >>"$ACTIVE_DB/logs/parse_bin.log"
                echo "$bin" >>"$ACTIVE_DB/logs/parse_bin.log"
                "$FILE_DIR/perls/parse_bin.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_bin.log"
                ;;
            *.jar)
                export start=$(date +"%T")
                printf "$bin:\t"
                echo -n "$start  " >>"$ACTIVE_DB/logs/parse_jar.log"
                echo "$bin" >>"$ACTIVE_DB/logs/parse_jar.log"
                "$FILE_DIR/perls/parse_jar.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_jar.log"
                ;;
            *.apk)
                export start=$(date +"%T")
                printf "$bin:\t"
                echo -n "$start  " >>"$ACTIVE_DB/logs/parse_apk.log"
                echo "$bin" >>"$ACTIVE_DB/logs/parse_apk.log"
                "$FILE_DIR/perls/parse_apk.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_apk.log"
                ;;
            *)
                if [ -x "$bin" ] ; then
                    export start=$(date +"%T")
                    printf "$bin:\t"
                    echo -n "$start  " >>"$ACTIVE_DB/logs/parse_bin.log"
                    echo "$bin" >>"$ACTIVE_DB/logs/parse_bin.log"
                    "$FILE_DIR/perls/parse_bin.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_bin.log"
                else
                    continue
                fi
                ;;
        esac
    done
shift
done

据我目前所知,这是可行的,但我对最后这部分很不确定

     *)
            if [ -x "$bin" ] ; then
                export start=$(date +"%T")
                printf "$bin:\t"
                echo -n "$start  " >>"$ACTIVE_DB/logs/parse_bin.log"
                echo "$bin" >>"$ACTIVE_DB/logs/parse_bin.log"
                "$FILE_DIR/perls/parse_bin.pl" "$bin" dbi:SQLite:dbname="$ACTIVE_DB/test.sqlite" 2>>"$ACTIVE_DB/logs/parse_bin.log"
            else
                continue
            fi

未来将会展现^^

相关内容