스크립트의 "\033[6n"과 같이 입력(버퍼)에 출력을 강제합니다.

스크립트의 "\033[6n"과 같이 입력(버퍼)에 출력을 강제합니다.

(C 프로그램 또는 스크립트) 출력이 입력 버퍼에 도달하도록 파이프와 리디렉션을 사용해 보았지만 printf "\033[6n"긍정적인 결과는 없었습니다.

이것이 어떻게 가능한지 아는 사람이 있습니까?

  1. 명령줄
  2. 쉘 스크립트에서
  3. C 코드

파이프된 출력 _cmd_ > /dev/stdin및 C 코드 에는 fprintf(stdin, "blah\n");측정 가능한 영향이 없습니다 .

노트:나는 입력을 다른 명령으로 "파이프"하고 싶지 않고 "키보드 버퍼"(사실)에 문자를 "주입"하고 싶습니다.

편집하다:초기 사용 사례는 다음 shell을 허용하는 샌드박스 CLI 애플리케이션입니다.system주문하다운영 체제(예: Bas)와 상호작용하지만아니요파일 설명자를 처리합니다.

답변1

편집하다:짧은 답변예전에는 /dev/uinput, 그리고 지금은 그렇습니다 TIOCSTI(포스트 끝 참조)


지금까지의 답변과 의견에 대한 응답은 다음과 같습니다.

ioctl_tty(2)TIOCSTI나는 그것을 가지고 있지 않지만 커널 소스 코드를 보면 (를 통해)자유 전자tiocsti)은 context 를 사용하는 "가짜 입력 문자"를 표시합니다 tty_struct.

문제의 애플리케이션은 항상 대화형으로 실행되므로 파이프와 리디렉션을 사용할 수 없습니다. 스크립팅에 사용할 수 있지만 shell다른 유사한 응용 프로그램과 달리 결과 캡처를 허용하지 않으며 일반적인 방법으로 작업을 허용 stdin및 수행합니다.stdout

가까운 미래에 이것이 바뀔 가능성은 없으며 그것은 내 응용 프로그램이 아닙니다. 그러나 컨텍스트를 사용하는 & in을 통해 커널에 의해 키보드 버퍼에 주입 "\033[6n"된 결과를 잘라낼 수 있습니다 .tty_insert_flip_chartty_schedule_flipsrc/drivers/tty/tty_buffer.ctty_port

제 기억이 맞다면 FD 파일 구조가 변경되기 전,오직4개의 파일 설명자가 이를 달성할 수 있습니다. 요즘에는 TTY 장치 에 쓸 수 있지만 /dev/stdinTTY 장치에 연결되어 있으며 TTY 장치에 쓴 모든 내용은 결국 화면에 표시됩니다( ). 커널은 TTY를 사용할 때 파일 설명자 라우팅을 우회하는 것 같습니다. 이러한 함수는 이를 호출합니다./proc/self/fd/0/dev/tty#/dev/stdoutflip포트.

사용자 공간 응용 프로그램은 이러한 커널 기능에 액세스할 수 없습니다. X-Windows에서는 xvkbdxdotool또는 를 사용할 수 있지만 xte이 응용 프로그램은 Linux(VT) 콘솔에서 사용됩니다.


(거의) 정답은 다음과 같습니다.

/dev/uinput사용자 권한이 없어도(대부분의 시스템에서) 모든 매개변수가 작동하는 sudo스크립트입니다 printf.

아니면 키보드이벤트또한 모든 사용자가 액세스할 수 있기 때문에 작동하지만 부팅할 때마다, 모든 시스템을 변경합니다(저는 일반적으로 이지만 /dev/input/event0항상 그런 것은 아닙니다).

추가 조사에 따르면 이러한 방법 중 특히 스크립팅에는 실용적이지 않습니다. 우리는 무엇을 해야 하는지 이해해야 합니다. 우리는 단지 렌더링을 원할 뿐입니다.텍스트"키 누르기 시뮬레이션"(위 장치의 작동 방식)이 아닌 입력 버퍼에 있습니다.


(가장 실용적인) 실제 답변은 다음과 같습니다.

오프사이트 질문은 2011년의 stackexchange에 대한 답변을 인용합니다(여기). . TIOCSTI​다시 Perl 예제를 살펴보면 응용 프로그램을 제공하지 않는 스크립팅에도 유용할 수 있습니다.

perl -le 'require "sys/ioctl.ph";
      ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV
     ' `_cmds_`

그러나 화면에도 반영됩니다. 몇 시간 동안 추가 조사와 실험을 거친 후 스크립트나 명령줄에서 다음이 실용적이게 되었습니다.

stty -echo; perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV ' `_cmds_` ;stty echo

노트:TIOCSTI탈퇴 했지만오픈BSD 6.2(2017년 10월) 분명히 Linux 커널 개발자는반대취소를 단호히 거부하십시오(다음에서 취소할 수 있음).OpenBSD 저널).

답변2

Debian Bullseye를 시작으로 거기 console-tools에 흡수된 것은kbdwritevt아니요포함하다. 원하는 경우 이 기사 끝부분의 업데이트에 소스를 연결할 수 있습니다.


writevt /dev/tty# text, 적어도 Linux, BSD 및 Unix에서는 현재 패키지의 일부입니다 console-tools. 사용자는 반드시쓰다VT 권한. 특히 (편집: OS에서 사용 가능한 경우) OP의 완전하고 정답은 다음과 같습니다.

writevt `tty` "`_cmds_`"

이 문제는 StackExchange 커뮤니티 전체가 기본 운영 체제에 대한 깊은 이해가 부족함을 보여줍니다. writevt매우 오래되었으며 99%(편집자: Debian Linux) 시스템에 설치되는 필수 명령입니다. 2002년 6월 현재, 데비안에는 매뉴얼 페이지나 관리자가 없었습니다. 이것이 15년 전의 일임에도 불구하고 많은 사람들이 그것에 대해 몰랐던 이유를 설명할 수 있습니다. 그러나 Kali Linux(이는모든 것) 일반적으로 아래에 나열되지 않습니다.쓸 수 있는 주문하다, 처음부터 거기에 있었음에도 불구하고.


Debian Buster부터는 writevt더 이상 기본적으로 설치되지 않으며 일부에 따르면 더 이상 어떤 패키지에도 존재하지 않을 수 있습니다(관리자 부족 또는 패키지 변경으로 인해 console-tools?)

업데이트: console-tools실제로 데비안 패키지 검색에서 더 이상 찾을 수 없으면 백포트할 수도 없습니다(원래 콘텐츠를 확인했습니다).

원본 패키지 프로젝트는 다음과 같습니다.

http://lct.sourceforge.net/

패치가 필요하지 않습니다. Raspbian/RPiOS에는 데비안 버전이 있습니다(Wheezy에서 Buster까지):

http://raspbian.raspberrypi.org/raspbian/pool/main/c/console-tools/

Yan Dirson의 말을 인용하자면:

현재 (공용) 소프트웨어 프로젝트 저는 Debian GNU/Linux 프로젝트에 참여하고 있으며 1997년부터 그 프로젝트에 참여했습니다.

http://ydirson.free.fr/en/software/

흡수되기를 기다리며 kbd- 2001

console-tools"Linux 콘솔 도구" 프로젝트의 패키지는 RPiOS에서 계속 사용할 수 있습니다. linuxconsoletoolsSourceForge에도 있는 "Linux 콘솔 프로젝트"의 패키지와는 다릅니다 .

관련 정보