[unix] 원격 활성 터미널에서 명령 실행

PID가 6350 인 터미널 에뮬레이터 (T1)가 열려 있다고 가정하십시오.

다른 터미널에서이 명령 (C1)을 입력하십시오.

echo "ls\n" > /proc/6350/fd/0

이것은 lsT1에 새 줄을 쓰지만 실행하지는 않습니다. 왜?

또한 cat|bashwith 를 사용해 echo "ls\n" > /proc/catid/fd/0보았지만 여전히 실행되지 않았습니다.

명령을 다른 터미널에 에코하고 명령을 실행하려면 어떻게해야합니까?

가능한 답변 :

$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;

이 경우 더 이상 터미널에 직접 쓸 수 없습니다 (모든 명령이이 터미널에 표시된 명령과 동일한 방식으로 표시됨).



답변

ttyecho다른 터미널 (tty / pts)에 명령을 보내고 명령을 실행할 수 있는 명령 줄 유틸리티 가 있습니다.

sudo ttyecho -n /dev/pts/5 ls

참조 : 명령 또는 데이터를 다른 터미널로 보내는 유틸리티 (tty / pts)

ttyechogithub의 소스 코드 도 참조하십시오 .

또 다른 흥미로운 tty 명령은 selectortty 입력 버퍼를 업데이트하는 콘솔의 실시간 대화식 패턴 매처입니다.

# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)

참조 : 선택기-콘솔에서 동적 검색


답변

에 쓰기를 할 때 /dev/pts/X( /proc/6350/fd/0, 1그에 2대한 심볼릭 링크 일 때) 프로세스 6350(또는 그 자식 중 하나, 적절하게 포크 된)가 무언가를 출력 할 때 발생하는 것과 똑같은 일이 발생 합니다. 터미널에 씁니다.

해당 장치 ( ) 에서 읽으 려고하면 cat < /dev/pts/X펑키 한 일이 발생합니다. 원래 쉘에 입력 한 내용이 표시되는 것을 볼 수 있습니다. (아마도 첫 번째 줄을 입력 한 후에 만 ​​가능합니다. 터미널 프로그램 ( xterm또는 사용중인 모든 것)이 일부 라인 버퍼링을 수행한다고 추측 하고 있으며 6350차단 된 쉘 read이 그 조각 을 가져 옵니다 . 후속 읽기에서이기는 것은 아니지만 나는 이것에 대해 완전히 틀릴 수 있습니다.)

문제는 해당 장치에서 읽거나 쓸 때 장치를 사용하는 다른 쉘과 대화하지 않는 것입니다. xterm예를 들어 터미널 에뮬레이터와 대화하고 있습니다. 터미널 에뮬레이터 만이 해당 채널 (쉘이 읽는 것)에 데이터를 주입 할 수 있으며, 쉘이 쓰는 모든 것은 터미널로 전달됩니다. 두 번째 쉘을 부착해도 변경되지 않습니다.

해당 6530프로세스에 명령을 삽입 하려면 터미널을 통해 명령 을 수행해야합니다 (X11 앱이든 다른 것이 든).

권장 사항 : ‘터미널’, ‘쉘’, ‘tty’및 ‘콘솔’의 정확한 차이점은 무엇입니까?


답변