Có thể ghi vào bảng tạm của thiết bị bằng ADB không?


26

Tôi quan tâm đến việc học cách viết vào (và nếu có thể, đọc từ) bảng tạm của thiết bị Android đã root.

Tôi hy vọng sẽ làm như vậy bằng ADB qua USB và tôi không quan tâm đến việc cài đặt bất kỳ ứng dụng nào để giúp tôi làm điều này, vì đây là điều tôi dự định hiếm khi làm.

Bất kỳ đề xuất hoặc giúp đỡ hướng dẫn tôi đi đúng hướng sẽ được đánh giá rất cao.


Đối với bất kỳ ai đang tìm kiếm các cách tiếp cận dễ dàng hơn cho trình giả lập, hãy xem tại đây: stackoverflow.com/questions/3391160/
mẹo

Câu trả lời:


21

Vâng, bạn thực sự có thể làm điều này. Nó trông có vẻ không ổn khi bạn kiểm tra bảng tạm, nhưng nó hoạt động tốt.

Trước hết, bạn có thể kiểm tra nội dung trong bảng tạm hiện tại bằng service call clipboard 1từ vỏ adb (hoặc, không cần tách vỏ trước adb shell service call clipboard 1). Nó có thể bắt đầu trống ban đầu sau khi khởi động lại, ví dụ:

# service call clipboard 1
Result: Parcel(
  0x00000000: 00000000 00000001 00000000 00000000 '................'
  0x00000010: 00000000 00000000                   '........        ')
#

Bạn có thể đặt văn bản vào bảng tạm bằng cách sử dụng service call clipboard 2, về cơ bản có 3 tham số - hai số nguyên và chuỗi bạn muốn đặt vào bảng tạm:

# service call clipboard 2 i32 1 i32 0 s16 "Hi there"
Result: Parcel(00000000    '....')

Thành thật mà nói, tôi không chắc hai thông số đầu tiên là gì. Một câu trả lời trên Stack Overflow đã gợi ý int đầu tiên là "số lượng vật phẩm trong bưu kiện" (một trong trường hợp này) và thứ hai là độ dài của chuỗi. Tuy nhiên, tôi đã sử dụng 0 cho tham số thứ hai và nó hoạt động tốt và tôi không thể tìm thấy bất kỳ tài liệu nào phù hợp với chức năng cụ thể này ... vì vậy hãy xem đó là giá trị của nó.

Trong mọi trường hợp, về cơ bản, nó tạo ra một đối tượng Parcel với 3 trường, sau đó chuyển nó vào bảng tạm. Sau đó, bảng tạm giải nén Parcel và đặt giá trị chuỗi được truyền vào dưới dạng nội dung của bảng tạm. Bạn có thể thấy điều này khi bạn truy xuất giá trị sau đó:

# service call clipboard 1
Result: Parcel(
  0x00000000: 00000000 00000001 00000000 00000008 '................'
  0x00000010: 00690048 00740020 00650068 00650072 'H.i. .t.h.e.r.e.'
  0x00000020: 00000000 00000000                   '........        ')
#

Tương tự, nếu bạn nhấn và giữ vào trường nhập văn bản và nhấn "Dán" sau khi thực hiện việc này, bạn sẽ nhận được văn bản được đặt qua call service clipboard 2dòng trên (và nó sẽ trông hoàn toàn bình thường).

(Các ví dụ trên đến từ HTC EVO của tôi, chạy CyanogenMod 7)


1
Cuối cùng tôi cũng có thể dán khóa WPA và kết nối với bộ định tuyến của mình: D. Cảm ơn bạn.
earthmeLon

3
@earthmeLon nếu bạn chỉ cố gắng tìm một cách dễ dàng để sao chép khóa WPA của mình, thì lần sau bạn có thể thấy dễ dàng hơn khi thực hiện seomthing như gửi email cho chính mình và sao chép / dán từ email hoặc sao chép tệp văn bản có chứa nó vào Thiết bị qua USB, sau đó mở và sao chép từ đó. Có các tùy chọn khác như Bàn phím Wifi cho phép bạn nhập (hoặc dán) từ PC và xuất hiện trên điện thoại.
GAThrawn

4
Khóa WPA của tôi rất nhạy cảm. Nó không nên được phát trên bất kỳ mạng không phải địa phương EVER. Cảm ơn những lời đề nghị @GAThrawn. Cuối cùng tôi sẽ tìm thấy nhiều sử dụng hơn cho chức năng này: D
earthmeLon

6
Tôi nhận được '........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')khi thực hiệncall service clipboard 2
cprcrack

3
Trong trường hợp bạn cần sao chép mật khẩu hoặc bất kỳ văn bản nào vào trường văn bản trên Android, bạn cũng có thể "abd shell input text 'String'" - Tôi đã từ bỏ trên bảng tạm ...
Philippe

14

Tôi đã sử dụng phương pháp này, và nó hoạt động tốt trong 4.x, nhưng thất bại đối với tôi trong kẹo mút. Trong khi tìm kiếm giải pháp thay thế, tôi đã tìm thấy điều này: /programming/3391160/paste-text-on-android-emulator

nó không chính xác như bạn muốn, nhưng đối với bản thân tôi, hầu hết thời gian tôi muốn sao chép văn bản vào clipboard là vì tôi muốn dán nó vào trường mật khẩu.

như một phần thưởng bổ sung, đây là tập lệnh của tôi (được chỉnh sửa 2015-04-24 để cho phép khoảng trắng trong văn bản ):

#!/bin/bash

if [[ "$1" != "" ]]
then
    TEXT=$1
else
    read -s -p "Enter text you want to insert: " TEXT
fi

ESCAPED_TEXT=`echo $TEXT | sed "s/\s/\%s/g"`
adb shell input text "$ESCAPED_TEXT"

Lý do bạn cần gấp đôi thoát khỏi chuỗi là có hai shell: shell của bạn và shell adb . Tuy nhiên, tôi nghi ngờ điều này sẽ thất bại đối với các nhân vật khác có ý nghĩa đặc biệt trong vỏ, như dấu và .
Dan Dascalescu

Nó thực sự sẽ là nhiệm vụ của vỏ adb để thực hiện việc thoát này một cách chính xác, nhưng rõ ràng nó không hoàn toàn. Trên phiên bản của tôi (1.0.31), không cần thoát không gian được sử dụng ở trên, nhưng tất cả các loại ký tự đặc biệt sẽ cần thoát (nhưng không thể làm điều này một cách đáng tin cậy).
Matthijs Kooijman

Một cách tốt hơn để xử lý các ký tự đặc biệt sẽ là chuyển qua stdin, đại loại như: echo "$TEXT" | adb shell xargs -0 input textCái nào sẽ xử lý bất kỳ văn bản nào, ngoại trừ các ký tự \ 0 (NUL). Thật không may, các phiên bản adb cũ hơn không chuyển tiếp stdin đến một lệnh được chỉ định trên dòng lệnh adb. Điều này được sửa trong các phiên bản adb mới hơn, nhưng nó cần Android N để hoạt động .
Matthijs Kooijman

Đối với không gian thoát, điều này rõ ràng là cần thiết cho inputlệnh trên thiết bị Android, không phải cho vỏ được sử dụng adb shell. Ngoài ra, nó chỉ cần cho SDK phiên bản 22 trở xuống (Lollipop và thấp hơn, tôi tin) theo câu trả lời này .
Matthijs Kooijman

4

Đây là một phiên bản cải tiến của tập lệnh bởi các galets ở trên. Như với tập lệnh đó, nó không ghi vào bảng tạm, nhưng gửi đầu vào đến trường đầu vào hiện đang tập trung, thường là những gì bạn muốn.

Kịch bản này được cải tiến để thoát khỏi các ký tự đặc biệt để tránh nhầm lẫn vỏ Android với chúng. Điều này sẽ cho phép bất kỳ chuỗi được gửi không thay đổi. Để ngăn readlệnh diễn giải dấu gạch chéo ngược (dấu), tôi đã thêm -r vào đó.

Điều này đã được kiểm tra bằng cách sử dụng danh sách các ký tự đặc biệt sau:

./adb-send-string ' \`~!@#$%^&*()-_=+[{]}|;:",<.>/?'\'

Đây là kịch bản:

#!/bin/bash
# Send text to android device using adb, emulating keyboard input.
# Based on a script from /android//a/105881/223695
# extended to support special characters

if [[ "$1" != "" ]]
then
    TEXT="$1"
else
    read -s -r -p "Enter text you want to insert: " TEXT
fi

escape() {
    # Encapsulate the string in $'', which enables interpretation of
    # \xnn escapes in the string. This is not POSIX-sh, but an extension
    # documented by bash and also supported by the Android sh.
    echo -n "$'"

    # Process each character in $1 one by one
    for (( i=0 ; i<${#1}; i++ )); do
        # Extract the i'th character
        C="${1:$i:1}"
        if [ "$C" = ' ' ]; then
            # Encode spaces as %s, which is needed for Android's
            # "input text" command below 6.0 Marshmellow
            # See /programming//documentation/android/9408/adb-shell/3958/send-text-key-pressed-and-touch-events-to-android-device-via-adb
            echo -n '%s'
        else
            # Encode everything else as \xnn, to prevent them from being
            # interpreted by the Android shell
            printf '\\x%02x' "'$C"
        fi
    done
    # Terminate the $''
    echo -n "'"
}

ESCAPED_TEXT=`escape "$TEXT"`
adb shell input text "$ESCAPED_TEXT"

3

Tôi đã thử và googled một chút và có vẻ như cách tiếp cận dịch vụ cuộc gọi-bảng tạm dừng hoạt động trong các Android mới hơn, nó đã thất bại đối với tôi trên phiên bản Android 4.4.4. Tức là bạn sẽ cần một ứng dụng để có quyền truy cập clipboard (đọc và viết) từ adb-shell. Tôi sử dụng clipper từ majido trên github . Apk cũng được lưu trữ, vì vậy không cần phải tự biên dịch nó. Khi cài đặt, bạn có thể kết hợp với nó bằng các lệnh quảng bá (ứng dụng sẽ cho bạn biết các lệnh chính xác). Ứng dụng không yêu cầu root.


Vì chúng tôi không biết mục đích của bạn là gì: bạn có thể vui lòng chỉnh sửa bài đăng của mình và bao gồm những gì ứng dụng đó làm không, và người ta phải sử dụng nó như thế nào? Mọi người đã bắt đầu gắn cờ bài đăng của bạn là "không phải là câu trả lời", vì rõ ràng họ bỏ lỡ điểm bạn muốn thực hiện. Cảm ơn trước!
Izzy

clipper làm việc tốt hơn cho tôi so với sử dụng 'văn bản nhập vào vỏ adb'. Thậm chí tốt hơn tập lệnh Python AdbPaste github.com/gcb/AdbPaste để bọc 'văn bản đầu vào vỏ adb'. Tôi đã tăng cường clipper để hỗ trợ một tham số tệp, vì vậy bây giờ tôi có thể gửi nhiều trang vào bảng tạm chỉ trong một hoặc hai giây. Mã nâng cao tại đây: github.com/RoundSparrow/clipper
RoundSparrow hilltx

0

Một tập lệnh khác sử dụng adb shell inputđể gửi các ký tự có thể được tìm thấy ở đây: https://github.com/gcb/AdbPaste

Đây là tập lệnh Python có thể được sao chép từ github hoặc trực tiếp tải xuống và chạy:

$ wget https://github.com/gcb/AdbPaste/raw/master/AdbPaste.py
$ chmod a+x AdbPaste.py
$ ./AdbPaste.py "some text to paste"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.