ADB를 사용하여 장치의 클립 보드에 쓸 수 있습니까?


26

루팅 된 Android 기기의 클립 보드에 쓰는 방법과 가능한 경우 읽는 방법에 관심이 있습니다.

USB를 통해 ADB를 사용하고 싶습니다.이 작업을 거의 수행하지 않기 때문에 앱을 설치하는 데 관심이 없습니다.

올바른 방향으로 안내하는 제안이나 도움이 있으면 대단히 감사하겠습니다.


에뮬레이터에 대한보다 쉬운 접근 방법을 찾는 사람은 여기를 참조하십시오 : stackoverflow.com/questions/3391160/…
Mygod

답변:


21

예, 실제로이 작업을 수행 할 수 있습니다. 클립 보드를 검사 할 때 형편없는 모양이지만 잘 작동합니다.

먼저 service call clipboard 1adb 쉘에서 또는 현재 쉘없이 먼저 현재 클립 보드 내용을 검사 할 수 있습니다 adb shell service call clipboard 1. 예를 들어, 재부팅 후 처음에는 비어있을 수 있습니다.

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

를 사용하여 텍스트를 클립 보드에 넣을 수 있습니다. service call clipboard 2기본적으로 2 개의 정수와 클립 보드에 넣을 문자열 인 3 개의 매개 변수를 사용합니다.

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

솔직히 말해서 처음 두 매개 변수가 무엇인지 잘 모르겠습니다. 스택 오버플로에 대한 한 답변 은 첫 번째 int는 "소포의 항목 수"(이 경우 하나)이고 두 번째는 문자열의 길이라고 제안했습니다. 그러나 두 번째 매개 변수에 0을 사용했는데 정상적으로 작동 하며이 특정 기능과 일치하는 문서를 찾을 수 없으므로 가치가있는 것으로 가져 가십시오.

어쨌든 기본적으로 3 개의 필드가있는 Parcel 객체를 만든 다음 클립 보드에 전달합니다. 클립 보드는 Parcel의 압축을 풀고 클립 보드의 내용으로 전달 된 문자열 값을 설정합니다. 나중에 값을 검색하려고 할 때 이것을 볼 수 있습니다.

# 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                   '........        ')
#

마찬가지로 텍스트 입력 필드를 길게 누르고이 작업을 수행 한 후 "붙여 넣기"를 누르면 call service clipboard 2위 의 줄을 통해 설정된 텍스트가 표시됩니다 (완전히 정상적으로 보입니다).

(위의 예는 CyanogenMod 7을 실행하는 HTC EVO에서 나왔습니다)


1
마지막으로 WPA 키를 붙여 넣고 라우터에 연결할 수 있습니다 : D. 고맙습니다.
earthmeLon 2012

3
@earthmeLon WPA 키를 쉽게 복사 할 수있는 방법을 찾으려고한다면 다음에 이메일로 자신에게 이메일을 보내거나 이메일에서 복사 / 붙여 넣기 또는이를 포함하는 텍스트 파일을 복사하는 것이 더 쉬울 것입니다. USB를 통해 장치를 연 다음 거기서 열고 복사하십시오. Wi-Fi 키보드 와 같은 다른 옵션 을 사용하여 PC에서 입력하거나 붙여 넣어 전화기에 표시 할 수 있습니다.
GAThrawn February

4
내 WPA 키는 민감합니다. 로컬이 아닌 네트워크를 통해 브로드 캐스트해서는 안됩니다. @GAThrawn 제안에 감사드립니다. 나는이 기능을 결국 더 많이 사용할 것이다 : D
earthmeLon

6
내가 만들 '........U.n.k.n.' 'o.w.n. .p.a.c.k.' 'a.g.e. ..... ')때 얻을call service clipboard 2
cprcrack

3
비밀번호 나 텍스트를 안드로이드의 텍스트 필드에 복사해야하는 경우 "abd shell input text 'String" "-클립 보드에 포기했습니다 ...
Philippe

14

나는이 방법론을 사용했고 4.x에서는 잘 작동했지만 롤리팝에서는 실패했습니다. 대체 솔루션을 찾고있는 동안 나는 이것을 발견했다 : https : //.com/questions/3391160/paste-text-on-android-emulator

정확히 원하는대로는 아니지만 텍스트를 클립 보드에 복사하려는 대부분의 시간은 암호 필드에 붙여 넣기를 원하기 때문입니다.

추가 보너스로 여기 내 스크립트가 있습니다 ( 텍스트에 공백을 허용하도록 2015-04-24 수정 ).

#!/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"

문자열을 이중으로 탈출해야하는 이유는 쉘과 adb 쉘이라는 두 가지 쉘있기 때문 입니다. 그러나 앰퍼샌드 와 같이 쉘에서 특별한 의미를 가진 다른 문자에는 이것이 실패 할 것으로 생각됩니다 .
Dan Dascalescu

실제로 이스케이프를 올바르게 수행하는 것은 adb shell의 작업이지만, 완전히 그렇지는 않습니다. 내 버전 (1.0.31)에서는 위에서 사용 된 공백 이스케이프가 필요하지 않지만 모든 종류의 특수 문자는 이스케이프해야합니다 (그러나이를 안정적으로 수행하는 것은 불가능합니다).
Matthijs Kooijman 2018 년

특수 문자를 처리하는 더 좋은 방법은 stdin을 통해 파이프하는 echo "$TEXT" | adb shell xargs -0 input text것입니다. \ 0 (NUL) 문자를 제외한 모든 텍스트를 처리해야합니다. 불행히도, 이전 adb 버전은 stdin을 adb 명령 줄에 지정된 명령으로 전달하지 않습니다. 이것은 최신 adb 버전에서 수정되었지만 작동하려면 Android N이 필요합니다 .
Matthijs Kooijman 2018 년

스페이스 이스케이프와 관련하여 이것은로 input사용되는 쉘이 아닌 Android 장치 의 명령에 필요합니다 adb shell. 또한 이 답변 에 따라 SDK 버전 22 이하 (롤리팝 이하, 필자가 믿는 것)에만 필요합니다 .
Matthijs Kooijman 2016 년

4

위의 galet에 의해 개선 된 스크립트 버전이 있습니다. 이 스크립트와 마찬가지로 클립 보드에는 쓰지 않지만 현재 포커스가있는 입력 필드로 입력을 보냅니다.

이 스크립트는 Android 셸과 혼동되지 않도록 특수 문자를 이스케이프하도록 개선되었습니다. 이를 통해 문자열을 변경하지 않고 보낼 수 있습니다. read명령이 (후행) 백 슬래시를 해석 하지 못하도록하기 위해 -r을 추가했습니다.

다음 특수 문자 목록을 사용하여 테스트했습니다.

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

스크립트는 다음과 같습니다.

#!/bin/bash
# Send text to android device using adb, emulating keyboard input.
# Based on a script from https://android.stackexchange.com/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 https://stackoverflow.com/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

나는 조금 시도하고 googled했고 call-service-clipboard-approach가 최신 안드로이드에서 작동을 멈추는 것처럼 보였으며 4.4.4 버전 Android에서는 실패했습니다. 즉, adb-shell에서 클립 보드 액세스 (읽기 및 쓰기)를 받으려면 앱이 필요합니다. github의 majido에서 클리퍼를 사용 합니다. APK도 호스팅되므로 직접 컴파일 할 필요가 없습니다. 설치되면 브로드 캐스트 명령을 사용하여 통신 할 수 있습니다 (앱에서 정확한 명령을 알려줍니다). 응용 프로그램은 루트가 필요하지 않습니다.


우리는 당신의 목적이 무엇인지 알지 못 하므로 편집 해 주시겠습니까? 게시물을 하고 해당 앱의 기능과 사용 방법을 포함시킬 수 있습니까? 사람들은 이미 글을 "답변이 아님"으로 표시하기 시작합니다. 원하는 지점을 놓치고 있기 때문입니다. 미리 감사드립니다!
Izzy

클리퍼는 'adb shell input text'를 사용하는 것보다 나에게 더 효과적이었습니다. 파이썬 스크립트 AdbPaste github.com/gcb/AdbPaste 보다 훨씬 낫습니다.'adb shell input text'를 감싸는 . 파일 매개 변수를 지원하도록 클리퍼를 향상 시켰으므로 이제 몇 초 안에 여러 페이지를 클립 보드로 보낼 수 있습니다. 개선 된 코드는 여기 : github.com/RoundSparrow/clipper
RoundSparrow hilltx

0

adb shell input문자를 보내는 데 사용 되는 다른 스크립트는 여기에서 찾을 수 있습니다. https://github.com/gcb/AdbPaste

이것은 github에서 복제하거나 직접 다운로드하여 실행할 수있는 Python 스크립트입니다.

$ wget https://github.com/gcb/AdbPaste/raw/master/AdbPaste.py
$ chmod a+x AdbPaste.py
$ ./AdbPaste.py "some text to paste"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.