Linux에서 터미널에 붙여넣을 때 줄 길이에 제한이 있나요?

Linux에서 터미널에 붙여넣을 때 줄 길이에 제한이 있나요?

kafka-console-producer.sh다음 에서 메시지를 보내려고 합니다 .

#!/bin/bash
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx512M"
fi
exec $(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"

그런 다음 Putty 터미널을 통해 메시지를 붙여넣습니다. 수신 측에서는 메시지가 약 4096바이트로 잘린 것을 확인했습니다. Kafka의 어느 곳에서도 이 제한이 설정되어 있지 않습니다.

이 제한이 bash/터미널 또는 Putty에서 발생할 수 있습니까?

답변1

4095는 Linux의 tty 줄 규칙에 대한 내부 편집기 길이 제한입니다. termios(3)매뉴얼 페이지 에서 :

  • 최대 줄 길이는 4096자입니다(종료 줄바꿈 문자 포함). 4096자보다 긴 줄은 잘립니다. 4095자 이후에는 입력 처리(예: ISIG 및 ECHO* 처리)가 계속되지만 4095자 이후의 모든 입력 데이터는 종료 개행 문자까지(포함하지 않음) 삭제됩니다. 이렇게 하면 최소한 한 줄을 읽을 수 있을 때까지 터미널이 항상 더 많은 입력을 받을 수 있습니다.

또한보십시오Linux 커널의 해당 코드.

예를 들어, 다음을 입력하면:

$wc-cEnter

Enter쉘 자체의 라인 편집기(bash의 readline)에서 쉘에 라인을 제출하십시오. 명령줄이 완료되면 셸은 이를 실행할 준비가 되므로 자체 줄 편집기를 남겨두고 터미널 장치를 다시 사양(일명.요리) 모드, 이는 대략적인 라인 편집기(실제로 커널의 tty 드라이버에서 구현됨)를 활성화합니다.

그런 다음 5000바이트 라인을 붙여넣은 경우 Ctrl+를 눌러 D해당 라인을 커밋하면 wc완료되었음을 알리는 출력이 다시 표시됩니다 4095.

(이 제한 사항은 bash자신의 줄 편집기에는 적용되지 않습니다. 쉘 프롬프트에 더 많은 데이터를 붙여넣을 수 있다는 것을 알게 될 것입니다 bash.)

따라서 수신 애플리케이션이 표준 입력에서 입력 라인을 읽고, 표준 입력이 터미널 장치이고, 애플리케이션이 자체 라인 편집기를 구현하지 않고(예를 들어 bash) 입력 모드를 변경하지 않는 경우 라인이 다음보다 길어집니다. 4096바이트(종료 줄 바꿈 문자 포함)는 입력할 수 없습니다.

stty -icanon그러나 수신 응용 프로그램을 시작하기 전에 터미널 장치의 줄 편집기(사용)를 비활성화하면 입력할 때 입력 내용을 직접 읽을 수 있습니다. 그러나 Backspace/ Ctrl+를 사용 W하여 입력을 편집하거나 Ctrl+를 사용 D하여 입력을 종료 할 수는 없습니다 .

다음을 입력하는 경우:

$ 저장됨 = $(stty -g); stty -icanon icrnl; 화장실 -c;Enter

5000바이트 길이의 줄을 붙여넣고 키를 누르면 Enter5001이 표시됩니다.

답변2

Stéphane Chazelas의 답변에서 언급했듯이 터미널 드라이버의 입력 편집 버퍼의 크기는 제한되어 있습니다.

터미널에 붙여넣는 대신 출력을 kafka-console-producer.sh파일로 리디렉션할 수 있습니다.

kafka-console-producer.sh > kafka.out

그런 다음 파일을 서버에 업로드하고 입력을 붙여넣으려는 프로그램의 입력으로 사용합니다.

some-program < kafka.out

답변3

예, 명령줄 길이, 더 정확하게는 전달되는 인수 길이에 제한이 있습니다 execve. "인간 처형"도 참조하십시오.

오래전에는 이 한도가 128kB였습니다. 최신 커널에서는 훨씬 더 높습니다.

따라서 4096으로 잘린 것은 이것과 아무 관련이 없습니다.

실제로 명령줄은 자동으로 잘리지 않습니다. 인수가 너무 길면 execve호출이 실패합니다.

답변4

질문은 방법이 아니라 왜/어디서인지에 관한 것이기 때문에 주제에서 벗어날 수 있습니다. 메시지를 파일로 출력한 다음 해당 파일을 스크립트로 보내는 것을 제안하는 잘못된 이미 투표된 답변(질문을 읽으려고 서두르면서 생성됨)을 현재 찾을 수 있기 때문에 어쨌든 이 글을 쓰라는 메시지를 받았습니다.

Stéphane Chazelas는 실제 질문에 대한 좋은 답변을 제공합니다. 즉, 4095자 + 입력 길이의 개행 제한은 터미널이 표준 모드에서 작동하는 방식에 대한 하드 코딩된 Linux 커널 제한에서 비롯됩니다(터미널은 일반적으로 표준 모드에 있음).

구체적인 설정에서 이를 추가로 입증하기 위해(How 질문에 대한 답변 제공) kafka-console-producer.sh다음과 같이 제한을 제거하도록 스크립트를 수정할 수 있습니다.

#!/bin/bash
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
    export KAFKA_HEAP_OPTS="-Xmx512M"
fi

tty_orig=$(stty -g)
stty -icanon
$(dirname $0)/kafka-run-class.sh kafka.tools.ConsoleProducer "$@"
stty "$tty_orig"

이렇게 하면 4095자에서 잘리지 않고 더 긴 메시지를 스크립트에 계속해서 붙여넣을 수 있습니다. kafka-console-producer.sh원본 스크립트가 Kafka 애플리케이션 제품군에서 제공되었으며 이를 편집하고 싶지 않은 경우 원본 스크립트를 호출하는 래퍼 스크립트를 생성할 수도 있습니다.

관련 정보