쉘 스크립트를 통해 키 입력을 주입하는 방법은 무엇입니까?


27

Bash 스크립트에서 입력을 시뮬레이션하기 위해 입력 데몬에 키 입력을 주입하려고합니다. 이것이 가능합니까? 그렇다면 가능하다면 어떻게해야합니까?


터미널에서 커널 수준 (있는 경우 어떤 OS에서), X 수준에서 입력을 시뮬레이트 하시겠습니까?
Gilles 'SO- 악의를 멈춰라'

커널 수준에서는 실제 키보드에서 실제 키를 누르는 것처럼 본질적으로 나타나기를 원합니다.
Naftuli Kay

@TKKocheran : 그렇다면 AIX에서? FreeBSD? 리눅스? OSX? … 대답은 각 변형마다 완전히 다를 가능성이 높습니다.
Gilles 'SO- 악 그만해'

1
무엇을 위해 필요한가요?
starblue

2
아마도 임의 간격으로 키 누르기를 무작위로 삽입하는 스크립트를 작성하고 싶습니다.
Naftuli Kay

답변:


23

Gilles의 질문과 같이 X 수준에서 작업하는 경우 xdotool을 다음 과 같이 사용 하십시오 .

xdotool key KEYSTROKE_SPECIFIER

KEYSTROKE_SPECIFIER는 "a"또는 "F2"또는 "control + j"와 같은 형식 일 수 있습니다.

편집 : Gilles의 질문에 대한 답변을 놓쳤습니다. 죄송합니다. 이 답변을 X-case의 해결책으로 남겨 두겠습니다.


3
나는 xte같은 수준에서 작동 한다고 생각 합니다.
Cascabel 2016 년

24

uinput드라이버를 사용하십시오 . 나는 그것을위한 유틸리티가 없다고 생각한다. 약간의 C 코드를 작성하거나 수정해야합니다. 간단히 말해서 :

#include <fcntl.h>
#include <ioctl.h>
#include <unistd.h>
#include <linux/input.h>
#include <linux/uinput.h>
/* Set up a fake keyboard device */
fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK); // or /dev/input/uinput
ioctl(fd, UI_SET_EVBIT, EV_KEY);
struct uinput_user_dev uidev = …;
write(fd, &uidev, sizeof(uidev));
ioctl(fd, UI_DEV_CREATE);
/* Send an event */
struct input_event ev = …;
write(fd, &ev, sizeof(ev));
/* Clean up */
ioctl(fd, UI_DEV_DESTROY);
close(fd);

보다 완전한 참고 자료 :


einfochips.com에 대한 링크가 끊어졌습니다. archive.org의 스냅 샷으로 교체했습니다.
phunehehe

이것이이 질문을 해결하는 데 도움이 될 것이라고 생각하십니까? unix.stackexchange.com/questions/156985/… , 나는 키를 누를 때이 프로그램이 문제가되는 응용 프로그램이 실제로 인식하는 다른 키를 보낼 것이라고 생각했습니다 (동시에도)?
물병 자리 힘

마우스를 만들고 움직일 수있는 Thiemonge의 샘플 코드는 키 스트로크를 가르치는 경우에도 키 스트로크를 만드는 방법을 알 수 없습니다.
Cestarian

@Cestarian 이것은 스택 오버플 로에 대한 질문처럼 들립니다 . 코드를 게시하고 예상 한 것과 대신 보이는 것을 설명하고 관련 오류 메시지, 로그 항목 등을 제공하십시오.
Gilles 'SO-stop

@Gilles 잘 알고 싶지만 질문 한계에 도달했다고합니다 ... 2 개의 질문에 대해 너무 많은 다운 보트를 받기 위해 잠시 전에 물었습니다. 아마도 내가 지운 훨씬 오래된 질문들에 대해 더 알고 싶습니다. 내가 여기 이렇게 많은 downvotes을 가지고 왜 지옥, 나는 알지도 못하는 stackoverflow.com/questions/20619023/... 나는 어쩌면 수신 된 오류를 게시하지 않았기 때문에 (비록 꽤 좋은 답변을 가지고), 그것은이었다? 어쨌든 주제에서 벗어납니다. 기본적으로 나는 할 수는 있지만 할 수는 없습니다. :(
Cestarian

9

키를 보낼 수있는 윈도우가있는 X 프로그램으로 작업하지 expect않는다면, 사용자가 터미널을 제어하는 ​​것처럼 다른 대화식 쉘 프로그램을 실행하기위한 편리하고 구성 가능한 프로그램을 찾고있을 것입니다 . 서로 다른 입력으로 다양한 출력에 응답하도록 프로그래밍 방식 응답을 설정할 수 있습니다.


7

나는 그것을하는 파이썬 코드를 썼다. 내 오픈 소스 프로젝트에서 찾을 수 있습니다.

http://code.google.com/p/pycopia/source/browse/trunk/core/pycopia/OS/Linux/event.py

해당 모듈을 루트로 스크립트로 실행하면 데모가 작동하는 것을 볼 수 있습니다.

이 기본 기능은 임베디드 시스템 (Android)에 대한보다 구체적인 구현을 제공하는 다른 프로젝트 인 powerdroid를 위해 확장되었습니다.

http://code.google.com/p/powerdroid/source/browse/trunk/src/droid/devices.py

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