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

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

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

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

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

배관 출력 _cmd_ > /dev/stdin과 C 코드는 fprintf(stdin, "blah\n");측정 가능한 효과가 없습니다.

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

편집하다:shell원래 사용 사례는 외부 또는 system외부를 허용하는 샌드박스 CLI 앱이었습니다.명령OS(예: Bas)와 상호 작용하지만~ 아니다파일 설명자를 처리합니다.

답변1

편집하다:짧은 대답~였다 /dev/uinput, 이제 TIOCSTI(포스트 끝 참조)


이것은 지금까지의 답변이며 의견을 해결하기 위해 다음과 같습니다.

ioctl_tty(2)나는 가지고 있지 않지만 TIOCSTI커널 소스를 검색합니다.자유전자tiocsti)은 컨텍스트를 사용하는 "가짜 입력 문자"를 표시합니다 tty_struct.

문제의 애플리케이션은 항상 대화형으로 실행 중이므로 파이프와 리디렉션을 사용할 수 없습니다. shell그러나 다른 유사한 앱과 달리 스크립팅을 위해 사용할 수 있으며 결과를 캡처하지도 허용하지도 stdin않고 stdout정상적으로 작업을 수행하도록 허용합니다.

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

메모리가 제공되는 경우 FD 파일 구조가 변경되기 전,오직4개의 파일 설명자를 사용하면 이를 달성하는 것이 가능할 수도 있습니다. 요즘에는 /dev/stdin또는 에 쓸 수 있지만 /proc/self/fd/0연결되어 있고 /dev/tty#TTY 장치에 쓴 모든 내용이 화면에 표시됩니다( /dev/stdout). 커널은 TTY를 사용할 때 파일 설명자 경로를 우회하는 것 같습니다. flip함수가 이를 다음과 같이 참조합니다.포트.

모든 사용자 영역 앱은 이러한 커널 기능 중 하나에 액세스할 수 없습니다. 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%(EDIT: 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 Console Project" 프로젝트의 패키지 와는 다릅니다 .

관련 정보