Linux gnu-screen 문자 제한을 우회하는 방법이 있습니까?

Linux gnu-screen 문자 제한을 우회하는 방법이 있습니까?

Linux 서버의 내 화면에 Minecraft 서버가 연결되어 있습니다. 저는 Python을 사용하여 Screen Stuff를 통해 Minecraft 서버에 데이터를 푸시하고 있습니다. 화면 내용에 너무 많은 문자를 넣으면 데이터가 화면에 푸시되지 않는 경향이 있다는 것을 알았습니다.

예를 들어, 다음은 정상적으로 작동합니다. Minecraft 화면에 텍스트를 푸시합니다. screen -r Minecraft -p0 -X stuff 'Some random text etc etc, contents are not relevant ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------^M'

100자 정도를 추가하면 콘텐츠를 보낼 수 없게 되고 제가 알 수 있는 오류 메시지가 생성되지 않습니다. screen -r Minecraft -p0 -X stuff 'Some random text etc etc, contents are not relevant-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------^M'

이는 screen stuff 명령에 문자 제한이 있음을 나타내는 것 같습니다. 그렇다면 더 많은 문자를 허용하는 대안이 있습니까? 나는 때때로 내가 관찰한 700-800자 제한을 초과하는 매우 긴 명령을 화면에 푸시합니다. 어쩌면 텍스트를 파일에 넣고 화면에 전달하는 것이 어떻게든 작동할까요?

답변1

글쎄, 매뉴얼 페이지에는 stuff큰 입력에는 사용할 수 없다고 나와 있습니다.

stuff [string]

현재 창의 입력 버퍼를 문자열로 채웁니다. 이는 "붙여넣기" 명령과 유사하지만 오버헤드가 훨씬 적습니다. [...]"stuff" 명령을 사용하여 큰 버퍼를 붙여넣을 수 없습니다. 키 바인딩에 가장 유용합니다.

그러나 이는 다음을 의미합니다 paste.

paste [registers [dest_reg]]

지정된 레지스터의 (연결된) 내용을 현재 창의 표준 입력 대기열에 씁니다. "."을 등록하면 붙여넣기 버퍼로 간주됩니다.

readbuf [-e encoding] [filename]

지정된 파일의 내용을 붙여넣기 버퍼로 읽어옵니다. [...]

screen나는 매뉴얼 페이지(2600줄, 166kB)를 편집기에 붙여넣어 이것을 시도했습니다.

screen -S test -X readbuf /tmp/screen.txt
screen -S test -X paste .

저장한 후 동일한 파일을 가져오므로 더 잘 작동할 것 같습니다 paste. 하지만 이는 여러 명령이 필요하다는 단점이 있으며 파일을 통해 데이터를 전달하지 않고도 이 작업을 수행할 수 있는지 여부는 알 수 없습니다.

아무튼, 화면을 통해 데이터를 붙여넣는 것이 실행 중인 서버에 명령을 보내는 가장 좋은 방법인지는 잘 모르겠지만, 마인크래프트가 stdin 외에 명령을 보내는 다른 방법을 제공하는지는 잘 모르겠습니다.

게임 서버에서 본 또 다른 솔루션은 입력을 파이프에서 서버로 리디렉션하는 것입니다.

tail -f inputfile | ./whateverserver ...

그런 다음 명령을 실행해야 하는 경우 를 실행하십시오 echo some command >> inputfile. 이는 입력을 채우는 것과 유사해야 합니다 screen.

단일 입력에 대한 명령을 자동 완성하는 이와 같은 솔루션에는 주의하지 않으면 동시에 전송된 여러 명령이 혼동될 수 있다는 문제가 있습니다. 실제로 이를 위해서는 폐쇄가 필요합니다.

답변2

해결 방법을 찾았습니다. 글자 수 제한 내에서 명령을 보내는 것만으로도 작동하는 것 같습니다. 이것은 Python에서의 설정입니다.

def runServerCode(code):
    while len(code) > 600:
        os.system("screen -r Minecraft -p0 -X stuff '" + code[:600] + "'")
        code = code[600:]
    code += "^M"
    os.system("screen -r Minecraft -p0 -X stuff '" + code + "'")

내가 가진 유일한 문제는 코드가 완료되기 전에 다른 정보가 화면에 전송되어 푸시된 코드가 중간 어딘가에서 분할되어 제대로 작동하지 않는 경우가 있다는 것입니다.

관련 정보