SSH経由で接続しているときに、ホストのキーボードから入力を読み取るにはどうすればよいですか?


10

私は現在、キーボードをエミュレートするRFIDカードリーダーを実験しています。カードを接続すると、カードからデータが読み取られ、構成に従ってキーストロークがエミュレートされます。

このデバイスをRaspberry Piに接続し、SSH経由でRaspberry Piに接続しました。

明らかに、リーダーがキーストロークをエミュレートするとき、それらはPiのローカルttyに到達します(私のSSHセッションではありません)。そのため、現在その入力に到達するのに苦労しています。

最終的には、入力を処理するソフトウェアを作成しますが、デバッグと開発の目的で、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 2013年

@barlop:私がやりたいことを達成するためにそれをしなければならなかった場合、それは私がやりたいことではありません。最後に実際に入力を取得するには、「何か」を記述する必要があります。このセットアップを現在の状態でテストできる簡単なアプローチを期待していました。
Der Hochstapler 2013年

sshがそれを行う機能を提供した場合、それは驚くべきセキュリティリスクになります。デフォルトでdest compのディストリビューションにネイティブアプリがバンドルされているとは思えません。
barlop 2013年

1
@barlop:まあ、私はそれがスーパーユーザー特権なしで動作するとは期待していません、それは確かです。
Der Hochstapler 2013年

回答:


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

現在キーボードが読み取られている場所からのログイン/ gettyプロセスのPIDを見つけるには、この関数の結果をgrepを介して渡すことができます。

ps -ef | grep tty

あなたは次のようなものを見ることができました

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

2番目の列の番号をメモします。これがPIDです。そして、キーボードがある場所である6列目。

そのプロセスを停止するには、次のコマンドを使用します(PIDが何であれ、番号に置き換えます)

kill -stop 23698

これで、キーボードのキーが来るところからttyを読み取ることができます(ttyはpsコマンドに表示されます)

cat /dev/ttyO0

catあなたはそれを殺すまで、キーボードの上に入力された内容を何でも出力、永遠に読み込みます。

完了して通常の動作に戻したい場合は、次のコマンドでキーボード機能を再開できます

kill -cont 23698

もちろん、それは一般的な考え方の概要です。ttyから読み取るには、独自のプログラムを使用できます。


/ sbin / gettyプロセスを
強制終了

2

最近ハッカソンのためにこれをしなければならなかったので、私は私たちがやったことに貢献するだろうと考えました。

  1. tty1(キーボードデバイスが入力をダンプしているメイン端末)にrootとして自動ログインを設定します。アーチのLinuxのwikiのエントリが良いの指示があります。再起動してログインします。

  2. 'ttyEcho'と呼ばれる小さなプログラムのソースをコピーします。1つのコピーがここにありますが、Google検索ではさらに多くのものが表示されます。このプログラムを使用すると、コマンドを別の端末にエコーできます。ターゲットマシンでコンパイルします。

  3. / dev / tty1で何でも実行できるようになったので、tty1の./ttyEcho -n /dev/tty1 'cat > buffer'すべての入力をファイルに追加することができます。常に拡張するファイルを作成する代わりに、mkfifo buffer最初にを使用して、名前付きパイプである特別なファイルを生成します-FIFOキューはメモリのみでサポートされています。

  4. SSHセッションから、tail -f filenametty1のすべてのキーボード入力を監視することができます。python内から、またはをopen('filename','r')呼び出し続けて、キーボードデータのフィードを取得します。.read().readline()

この方法は、キーボードスキャンコードの解析を回避し、コードなしでデータの大きなバッファを保持するため、私たちにとっては素晴らしい方法でした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.