악의적인 호기심으로 각각 bash 쉘을 실행하는 2개의 터미널을 열었습니다. 첫 번째 항목에는 다음을 입력합니다.
$ echo $$
11458
두 번째에서는:
$ echo -n "echo this command" >> /proc/11458/fd/0
그런 다음 해당 텍스트는 echo this command
말 그대로 첫 번째 터미널의 프롬프트로 파이프됩니다. 하지만 첫 번째 터미널에 입력하면 텍스트가 명령으로 실행되지 않고 새 프롬프트만 표시됩니다.
두 번째 시도에서는 첫 번째 터미널에서 다음 명령을 실행했습니다.
$ read line;echo $line
읽기가 입력을 기다리는 동안 /proc/11458/fd/0
두 번째 터미널에 일부 텍스트를 다시 표시합니다. 텍스트는 첫 번째 터미널에 나타나지만 <enter>
첫 번째 터미널을 누르면 read
종료되고 echo $line
입력 내용을 읽지 못했다는 메시지가 표시됩니다.
그래서 나는 여전히 해를 끼칠 수 있는 방법을 찾지 못했습니다. 제가 할 수 있는 일은 두 번째 터미널에서 첫 번째 터미널의 텍스트를 수정하는 것뿐입니다. 물론 첫 번째 터미널의 화면 판독기가 이를 인식합니다. 스크린 리더를 사용하여 마우스 선택이나 터미널 기능에 대해 생각하고 있습니다. 예를 들어 Save Contents ...
두 가지를 모두 시도해 보았습니다.
하지만 파일 끝이나 기타 제어 문자를 첫 번째 터미널에 에코하는 방법을 안다면 stdin
첫 번째 터미널에서 프로세스를 엉망으로 만들지 않을까요?
답변1
파트 1 - 귀하의 질문에 대한 답변이 되었습니까?프로세스의 표준 입력에 쓰기
파트 2 - 자신이 소유한 모든 프로세스에 속한 터미널에 쓰고 읽을 수 있습니다. 그러나 표준 UNIX 권한을 사용하면 다른 사용자 로그인과 관련된 장치에 쓰거나 읽을 수 없습니다.
ls -l /proc/$$/fd/0
lrwx------ 1 roaima roaima 64 Nov 27 13:19 /proc/7859/fd/0 -> /dev/pts/0
ls -lL /proc/$$/fd/0
crw--w---- 1 roaima tty 136, 0 Nov 27 13:24 /proc/7859/fd/0
장치에 쓸 수 있습니다:
( tput smso; echo 'surprise!' ) >/dev/pts/0
답변2
이것은 간단한 설명일 수 있습니다:
터미널 프로세스가 터미널( stdin
, stdout
및 stderr
모두 동일한 장치/pty를 가리킴)에 쓰는 경우 해당 출력은 다음 입력이 되지 않습니다. 확실히.
에코 리치
입력과 효과가 다릅니다 fooenter.
그렇다면 터미널에 쓰는 다른 프로세스가 다른 프로세스의 터미널 입력이 되는 이유는 무엇일까요? 무의미한.
파일과 달리 (의사) 터미널을 사용하면 데이터 소스가 완전히 다른 것(키보드 또는 프로그램)이기 때문에 쓰고 읽는 데이터는 관련이 없습니다. 바라보다 man 7 pty
. 의사 터미널에는 터미널 애플리케이션에서 사용하는 클라이언트와 클라이언트 입력을 생성하는 마스터가 있습니다.
내 터미널 에뮬레이터는 konsole(PID 40818)이며 현재 셸/터미널만 실행 중입니다.
start cmd:> ll /proc/40818/fd
insgesamt 0
lr-x------ 1 hl hauke 64 27. Nov 15:06 0 -> 'pipe:[1177680901]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 1 -> 'socket:[89302]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 10 -> /dev/dri/renderD128
lrwx------ 1 hl hauke 64 27. Nov 15:06 11 -> /dev/dri/renderD128
lrwx------ 1 hl hauke 64 27. Nov 15:06 12 -> /dev/dri/renderD128
lrwx------ 1 hl hauke 64 27. Nov 15:06 13 -> /dev/dri/renderD128
lrwx------ 1 hl hauke 64 27. Nov 15:06 18 -> /dev/ptmx
lrwx------ 1 hl hauke 64 27. Nov 15:06 19 -> /dev/pts/40
lrwx------ 1 hl hauke 64 27. Nov 15:06 2 -> 'socket:[89302]'
l-wx------ 1 hl hauke 64 27. Nov 15:06 21 -> 'pipe:[1177664260]'
lr-x------ 1 hl hauke 64 27. Nov 15:06 28 -> 'pipe:[1177664264]'
l-wx------ 1 hl hauke 64 27. Nov 15:06 29 -> 'pipe:[1177664264]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 3 -> 'socket:[1177673938]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 4 -> 'anon_inode:[eventfd]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 5 -> 'anon_inode:[eventfd]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 6 -> 'socket:[1177650969]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 7 -> 'anon_inode:[eventfd]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 8 -> 'socket:[1177677086]'
lrwx------ 1 hl hauke 64 27. Nov 15:06 9 -> 'socket:[1177677087]'
ec:0 15:06:36 hl@monster:~
start cmd:> tty
/dev/pts/40
/dev/pts/40
쉘은 을 사용 하지만 터미널 에뮬레이터는 에 쓰는 것을 볼 수 있습니다 /dev/ptmx
. 터미널 에뮬레이터의 파일 설명자만 18
/dev/pts/40에 쓸 수 있습니다. 다른 프로세스가 열리면 /dev/ptmx
새로운 의사 터미널이 생성되어 기록됩니다.