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


10

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;

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



나는 그것을 읽었지만별로 도움이되지 않습니다.
rvlander

1
그것은 당신에게 그것을 할 수있는 방법을 제공하는 것처럼 "유용하지"않을 수도 있지만, 그것은 당신의 질문에 대답합니다 : 당신은 할 수 없습니다. 달성하려는 최종 목표를 알려주고 다른 방법이 있는지 확인할 수 있습니다.
케빈

알 수 없지만 왜 다른 터미널에 텍스트가 표시됩니까?
rvlander

쉘이 아닌 터미널 인터페이스로 텍스트를 보내기 때문입니다.
rush

답변:


11

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)

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


슬프게도 ttyechogithub의 소스 코드에 대한 링크 가 끊어진 것 같습니다. 그러나 지금 은 github.com/osospeed/ttyecho 에서 사용할 수 있습니다 .
Wilson F

7

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

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

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

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

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


1
흥미롭게도, pts ( cat /dev/pts/x, 당신은 필요하지 않습니다 <) 에서 읽는 것은 터미널 사이에 문자가 엄격하게 교대로 나타납니다.
케빈

리디렉션을 사용하지 않으면 크게 변경되지 않을 수 있습니다. 어느 쪽이든 예측할 수없는 출력을 얻습니다.
Mat

흥미 롭습니다. 링크 주셔서 감사합니다. 그래서 /proc/6350/fd/0의 표준 입력 부모에 simlink입니다 process 6350터미널 인가. 창 응용 프로그램과 동일하다고 생각합니까?
rvlander
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.