SSH를 통해 연결된 경우 호스트 키보드에서 입력을 읽으려면 어떻게해야합니까?


10

현재 키보드를 에뮬레이트하는 RFID 카드 리더로 실험하고 있습니다. 카드를 연결하면 카드에서 데이터를 읽은 다음 구성에 따라 키 입력을 에뮬레이트합니다.

이 장치를 Raspberry Pi에 연결하고 SSH를 통해 Raspberry Pi에 연결했습니다.

분명히, 독자가 이제 키 입력을 에뮬레이트 할 때, 그들은 내 SSH 세션이 아닌 Pi의 로컬 tty에 도착합니다. 그래서 지금 그 입력에 어려움을 겪고 있습니다.

궁극적으로 입력을 처리하기 위해 소프트웨어를 작성하지만 디버깅 및 개발 목적으로 SSH 세션에서 키보드 입력을 얻는 것이 도움이 될 것입니다.

나는 다음을 시도했다

sudo cat /dev/input/by-id/usb-HID_OMNIKEY_5127_CK_01010053423438303000835748112531-event-kbd

어느 않습니다 내가 카드를 연결할 때 약간의 출력을 제공하지만, 내가 기대 한 것이 무엇 아니다. 그것은 원시 입력 데이터 인 것 같습니다. 키를 읽을 수있는 값으로 가져오고 싶습니다.

/dev/input장치 에서 읽는 데이터는 다음을 통해 파이핑 할 때 좀 더 의미가 있습니다 hexdump.

pi@raspberrypi ~ $ sudo cat /dev/input/by-id/usb-HID_OMNIKEY_5127_CK_01010053423438303000835748112531-event-kbd | hexdump
0000000 eef8 5138 219a 0008 0004 0004 0024 0007
0000010 eef8 5138 21ad 0008 0001 0008 0001 0000
0000020 eef8 5138 21b3 0008 0000 0000 0000 0000
0000030 eef8 5138 6019 0008 0004 0004 0024 0007
0000040 eef8 5138 602a 0008 0001 0008 0000 0000
0000050 eef8 5138 602f 0008 0000 0000 0000 0000
0000060 eef8 5138 9e97 0008 0004 0004 0023 0007
0000070 eef8 5138 9eab 0008 0001 0007 0001 0000
0000080 eef8 5138 9eb1 0008 0000 0000 0000 0000
0000090 eef8 5138 dd18 0008 0004 0004 0023 0007
00000a0 eef8 5138 dd26 0008 0001 0007 0000 0000
00000b0 eef8 5138 dd2b 0008 0000 0000 0000 0000
00000c0 eef8 5138 1b9a 0009 0004 0004 0021 0007
00000d0 eef8 5138 1baf 0009 0001 0005 0001 0000
00000e0 eef8 5138 1bb4 0009 0000 0000 0000 0000
00000f0 eef8 5138 5a15 0009 0004 0004 0021 0007
0000100 eef8 5138 5a24 0009 0001 0005 0000 0000
0000110 eef8 5138 5a29 0009 0000 0000 0000 0000
0000120 eef8 5138 989e 0009 0004 0004 0020 0007
0000130 eef8 5138 98b3 0009 0001 0004 0001 0000
0000140 eef8 5138 98b9 0009 0000 0000 0000 0000
0000150 eef8 5138 d71d 0009 0004 0004 0020 0007
0000160 eef8 5138 d72b 0009 0001 0004 0000 0000
0000170 eef8 5138 d730 0009 0000 0000 0000 0000
0000180 eef8 5138 15a1 000a 0004 0004 0009 0007
0000190 eef8 5138 15b5 000a 0001 0021 0001 0000
00001a0 eef8 5138 15bb 000a 0000 0000 0000 0000
00001b0 eef8 5138 541e 000a 0004 0004 0009 0007
00001c0 eef8 5138 542d 000a 0001 0021 0000 0000
00001d0 eef8 5138 5432 000a 0000 0000 0000 0000
00001e0 eef8 5138 92a3 000a 0004 0004 0004 0007
00001f0 eef8 5138 92b8 000a 0001 001e 0001 0000
0000200 eef8 5138 92be 000a 0000 0000 0000 0000
0000210 eef8 5138 d123 000a 0004 0004 0004 0007
0000220 eef8 5138 d131 000a 0001 001e 0000 0000
0000230 eef8 5138 d136 000a 0000 0000 0000 0000
0000240 eef8 5138 0fab 000b 0004 0004 0021 0007
0000250 eef8 5138 0fbf 000b 0001 0005 0001 0000
0000260 eef8 5138 0fc5 000b 0000 0000 0000 0000
0000270 eef8 5138 4e22 000b 0004 0004 0021 0007
0000280 eef8 5138 4e31 000b 0001 0005 0000 0000
0000290 eef8 5138 4e36 000b 0000 0000 0000 0000
00002a0 eef8 5138 8ca5 000b 0004 0004 0023 0007
00002b0 eef8 5138 8cb9 000b 0001 0007 0001 0000
00002c0 eef8 5138 8cbe 000b 0000 0000 0000 0000
00002d0 eef8 5138 cb2b 000b 0004 0004 0023 0007
00002e0 eef8 5138 cb3a 000b 0001 0007 0000 0000
00002f0 eef8 5138 cb40 000b 0000 0000 0000 0000

입력 이 되어야합니다 .7643fa46


귀하의 질문을 이해하면 기술적 인 의미에서 ssh와 거의 관련이 없으며 C로 작성되어 대상 컴퓨터에서 실행되는 일종의 키 로거를 원할 것입니다. 대상 컴퓨터로 ssh 할 때
barlop

@ barlop : 내가 원하는 것을 달성하기 위해 그렇게 해야 한다면 그것은 내가하고 싶은 것이 아닙니다. 나는 실제로 입력을 잡기 위해 "무언가"를 작성해야 할 것이다. 나는 현재 상태에서이 설정을 테스트 할 수있는 빠른 접근법을 원했다.
Der Hochstapler

ssh가 기능을 제공하면 놀라운 보안 위험이 될 수 있으며 기본적으로 dest comp의 배포판에 번들로 제공되는 기본 앱이 의심됩니다.
barlop

1
@ barlop : 글쎄, 슈퍼 유저 권한 없이는 작동하지 않을 것입니다.
Der Hochstapler

답변:


8

이 해킹 된 스크립트는 현재 나를 위해 작동합니다.

import string

from evdev import InputDevice
from select import select

keys = "X^1234567890XXXXqwertzuiopXXXXasdfghjklXXXXXyxcvbnmXXXXXXXXXXXXXXXXXXXXXXX"
dev = InputDevice('/dev/input/by-id/usb-HID_OMNIKEY_5127_CK_01010053423438303000835748112531-event-kbd')

while True:
   r,w,x = select([dev], [], [])
   for event in dev.read():
        if event.type==1 and event.value==1:
                print( keys[ event.code ] )

python-evdev 를 사용 하여 읽을 /dev/input/foo수 있고 읽을 수있는 값으로 변환합니다.

이것은 스크립트를 실행하고 리더에 카드를 연결할 때 얻는 것입니다.

pi@raspberrypi ~ $ python test.py
7
6
4
3
f
a
4
6

4

필요한 권한이 있다고 가정 할 때 다음 부팅까지 쉽게 작동 할 수있는 간단한 해킹이 있습니다.

다음 명령을 사용하면 컴퓨터에서 실행중인 모든 프로세스가 표시됩니다

ps -ef

키보드를 현재 읽는 곳에서 로그인 / 게티 프로세스의 PID를 찾으려면 grep을 통해이 함수의 결과를 전달할 수 있습니다.

ps -ef | grep tty

당신은 같은 것을 볼 수 있습니다

root     23698     1  0 18:17 ttyO0    00:00:00 /sbin/getty -L ttyO0 115200 vt102

두 번째 열의 숫자, 즉 PID를 기록해 두십시오. 그리고 여섯 번째 열은 키보드가있는 곳입니다.

해당 프로세스를 중지하려면 다음 명령을 사용하십시오 (PID가 무엇이든 숫자로 대체)

kill -stop 23698

이제 키보드 키가 나오는 곳에서 tty를 읽을 수 있습니다 (tty는 ps 명령에 표시됨)

cat /dev/ttyO0

cat키보드는 사용자가 키보드를 죽일 때까지 입력 된 내용을 영원히 읽습니다.

작업을 마치고 정상적인 동작으로 돌아가려면 다음과 같이 키보드 기능을 다시 시작할 수 있습니다

kill -cont 23698

물론 그것은 일반적인 아이디어를 요약합니다. 자신의 프로그램을 사용하여 tty에서 읽을 수 있습니다.


/ sbin / getty 프로세스를 종료하면 자동으로 다시 시작됩니다
davidgyoung

2

최근에 Hackathon을 위해이 작업을 수행 했으므로 결국 우리가 한 일에 기여할 것이라고 생각했습니다.

  1. tty1 (키보드 장치가 입력을 덤프하는 기본 터미널)에서 루트로 자동 로그인을 설정하십시오. 아치 리눅스 위키 항목은 좋은 지침이있다. 다시 부팅하여 로그인하십시오.

  2. 'ttyEcho'라는 작은 프로그램의 소스를 복사하십시오. 여기 에서 사본 하나를 찾을 수 있지만 Google 검색에서 더 많은 정보를 얻을 수 있습니다. 이 프로그램을 사용하면 다른 터미널에 명령을 에코 할 수 있습니다. 대상 머신에서 컴파일하십시오.

  3. 이제 / dev / tty1에서 무엇이든 실행할 수 있으므로 tty1의 ./ttyEcho -n /dev/tty1 'cat > buffer'모든 입력을 파일에 추가하기 만하면 됩니다. 확장 파일을 만드는 대신 mkfifo buffer먼저 이름 지정된 파이프 인 특수 파일 (메모리로만 지원되는 FIFO 대기열)을 생성하십시오.

  4. SSH 세션 tail -f filename에서 tty1의 모든 키보드 입력을 볼 수 있습니다 . 파이썬 내 에서 키보드 데이터를 가져 오기 open('filename','r')위해 계속 호출 .read()하거나 계속 .readline()실행하십시오.

이 방법은 키보드 스캔 코드 파싱을 피하고 코드없이 데이터의 큰 버퍼를 유지하기 때문에 우리에게 좋았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.