파이프와 리디렉션을 사용하여 (C 프로그램 또는 스크립트) 출력이 입력 버퍼에서 끝나도록 시도했지만 printf "\033[6n"
긍정적인 결과는 없습니다.
이것이 어떻게 가능한지 아는 사람이 있습니까?
- 명령줄
- 쉘 스크립트에서
- 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_char
tty_schedule_flip
src/drivers/tty/tty_buffer.c
tty_port
메모리가 제공되는 경우 FD 파일 구조가 변경되기 전,오직4개의 파일 설명자를 사용하면 이를 달성하는 것이 가능할 수도 있습니다. 요즘에는 /dev/stdin
또는 에 쓸 수 있지만 /proc/self/fd/0
연결되어 있고 /dev/tty#
TTY 장치에 쓴 모든 내용이 화면에 표시됩니다( /dev/stdout
). 커널은 TTY를 사용할 때 파일 설명자 경로를 우회하는 것 같습니다. flip
함수가 이를 다음과 같이 참조합니다.포트.
모든 사용자 영역 앱은 이러한 커널 기능 중 하나에 액세스할 수 없습니다. X-Windows에서는 xvkbd
및 xdotool
또는 사용이 가능 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
되었습니다 .kbd
writevt
~ 아니다포함됩니다. 원하신다면 이 게시물 끝에 있는 업데이트에 소스가 링크되어 있습니다.
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
업데이트: 사실 데비안 패키지 검색(원래 내용을 확인한 곳)에서 더 이상 찾을 수 없으며 백포트도 찾을 수 없습니다.
원본 패키지 프로젝트는 다음과 같습니다.
패치가 필요하지 않습니다. 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/
console-tools
"Linux 콘솔 도구" 프로젝트의 패키지는 RPiOS에서 계속 사용할 수 있습니다 . linuxconsoletools
SourceForge에도 있는 "Linux Console Project" 프로젝트의 패키지 와는 다릅니다 .