ssh 명령이 종료되지 않습니다

ssh 명령이 종료되지 않습니다

내 Android 휴대폰에서 데스크톱 클립보드를 설정하는 스크립트를 작성했습니다.

#!/bin/sh

ssh -Y user@host "export DISPLAY=:0; echo -n $(termux-clipboard-get) | xclip -selection clipboard"

스크립트가 예상대로 작동하지만 종료되지 않습니다. 프롬프트로 돌아가려면 Ctrl+를 눌러야 합니다 .C

옵션 을 사용했는데 -f즉시 반환됩니다. 에서 man ssh:

-f
ssh명령 실행 직전에 백그라운드로 이동하도록 요청합니다 . 이는 ssh암호나 패스프레이즈를 요청하려고 하는데 사용자가 백그라운드에서 이를 원하는 경우에 유용합니다 . […]

이 문제를 해결하는 올바른 방법인지 확실하지 않습니다. 백그라운드에서 실행할 필요는 없습니다. 명령을 실행하고 반환하기만 하면 됩니다.

왜 반품이 안 되나요 ssh? ssh -f좋은 방법 인가요 ? 더 좋은 방법이 있나요?

답변1

에서이 답변:

X에서의 선택은 두 개의 X 클라이언트가 협력하여 작동합니다. 하나의 X 클라이언트는 자신에게 선택 항목(기본, 보조, 클립보드)이 있다고 주장하고 선택 항목을 붙여넣으려는 다른 X 클라이언트는 이를 수신하기 위해 첫 번째 클라이언트에 연락합니다.

귀하의 경우 원본은 xclip죽었지만 그 자식은 살아남아 선택 항목이 있다고 주장하고 붙여넣기를 원하는 향후 클라이언트를 위해 서비스를 제공합니다. 완전히 분리되지 않고 SSH 서버가 종료될 때까지 기다리는 것으로 보입니다. 그래서 ssh클라이언트는 그것이 종료될 때까지 기다립니다. 따라서 Ctrl+ 가 필요합니다 C.

나중에 다른 클라이언트가 선택 항목이 있다고 주장하면 리모컨이 xclip종료되고 로컬 차단이 해제됩니다 ssh. 이는 해결 방법이 -f그리 나쁘지 않다는 것을 의미합니다. 백그라운드 프로세스가 누적되지 않고 최대 하나가 정지됩니다 ssh.

연결된 답변은 다소 관련이 있는 것처럼 보이는 문제를 해결하려고 시도합니다.또 다른 답변거기에 조언합니다 xsel. 실제로 내 테스트에서는 다음이 차단되지 않습니다.

ssh -Y user@host "export DISPLAY=:0; echo -n foobar | xsel -i -b"

xclip로 변경하는 것이 xsel중요합니다. 여전히 원래 명령이 더 향상될 수 있습니다.

  • 원격 명령이 로컬 X 서버와 상호 작용하지 않기 때문에 -Y(또는 ) 이 필요하지 않다고 생각합니다 . 원하는 디스플레이를 가리 키도록 오른쪽으로 -X설정하면 충분합니다 .DISPLAYxsel현지의에게 xsel.

  • 그럴 필요가 없습니다 export. 변수는 에만 관련되므로 xsel다음 스니펫이면 충분합니다.DISPLAY=:0 xsel -i -b

  • 심각한 결함. $(termux-clipboard-get)로컬로 확장되며, 무엇을 얻든 termux-clipboard-get원격 셸에 전달하는 문자열에 포함됩니다.반복된코드로.

    예를 들어 termux-clipboard-get반환 하면 ; rm -f /very/important/file; true원격 쉘이 실행됩니다.

    export DISPLAY=:0; echo -n ; rm -f /very/important/file; true | …
    

    그것이 무엇을 하는지 아시나요? 올바른 방법은 다음으로 파이프하는 것입니다 ssh.

    termux-clipboard-get | ssh user@host 'DISPLAY=:0 xsel -i -b'
    

    이렇게 하면 출력이 termux-clipboard-get코드로 처리되지 않습니다.

  • 후행 개행 문자 없이 의도적 echo -n으로 출력을 얻는 데 사용했던 것 같습니다 . termux-clipboard-get그렇다면 로컬에서 후행 개행 문자를 제거하고의존하지 않는다echo:

    printf '%s' "$(termux-clipboard-get)" | …
    

최종 형식은 다음과 같습니다.

printf '%s' "$(termux-clipboard-get)" | ssh user@host 'DISPLAY=:0 xsel -i -b'

이 명령은 바이너리로 해석되고 변경되지 않아야 하는 데이터에서도 후행 개행 문자를 제거합니다. NUL 문자도 문제가 됩니다. 일부 데이터를 그대로 전달해야 하는 경우 다음에서 termux-clipboard-get직접 파이프하면 됩니다.

termux-clipboard-get | ssh …

관련 정보