원격 SSH 세션에서 로컬 클립 보드로 데이터를 보내는 방법


161

Borderline ServerFault 질문이지만 저는 쉘 스크립트를 프로그래밍 하고 있으므로 먼저 여기에서 시도하고 있습니다. :)

대부분의 * nix에는 출력을 로컬 클립 보드 / 페이스트 보드로 파이프 / 리디렉션하고 동일한 것을 검색 할 수있는 명령이 있습니다. OS X에서 이러한 명령은

pbcopy, pbpaste 

다른 서버에 SSH로 연결된 상태에서이 기능을 복제 할 수 있습니까? 그건,

  1. 컴퓨터 A를 사용하고 있습니다.
  2. 터미널 창을 엽니 다
  3. 컴퓨터 B에 SSH
  4. 컴퓨터 B에서 명령을 실행합니다
  5. 컴퓨터 B의 출력은 컴퓨터 A의 클립 보드로 리디렉션되거나 자동으로 복사됩니다.

그리고 예, 마우스를 사용하여 명령에서 텍스트를 선택할 수 있다는 것을 알고 있지만 원격 세션에서 동일하게 원하는 결과를 클립 보드로 직접 출력하는 워크 플로우에 익숙했습니다.

코드는 유용하지만 일반적인 접근 방식도 높이 평가됩니다.

답변:


89

나는 같은 종류의 솔루션을 찾고 있었기 때문에이 스레드를 부활시키고 있으며, 나에게 맞는 것을 찾았습니다. OSX Daily 의 제안을 약간 수정했습니다. .

필자의 경우 로컬 OSX 시스템의 터미널을 사용하여 SSH를 통해 Linux 서버에 연결합니다. OP와 마찬가지로 키보드 만 사용하여 작은 비트의 텍스트를 터미널에서 로컬 클립 보드로 전송할 수 있기를 원했습니다.

솔루션의 본질 :

commandThatMakesOutput | ssh desktop pbcopy

ssh 세션에서 원격 컴퓨터로 실행될 때이 명령은 commandThatMakesOutput (예 : ls, pwd) 의 출력을 가져 와서 출력을 로컬 컴퓨터의 클립 보드 ( "desktop"의 이름 또는 IP)로 파이프합니다. 즉, 중첩 된 ssh를 사용합니다. 하나의 ssh 세션을 통해 원격 컴퓨터에 연결하고 명령을 실행하면 원격 컴퓨터는 다른 ssh 세션을 통해 데스크탑에 연결하고 텍스트를 클립 보드에 넣습니다.

데스크톱을 ssh 서버로 구성해야합니다 (나는 당신과 구글에게 맡깁니다). 세션 당 암호 문구를 사용하거나 보안에 필요한 모든 것을 사용하여 빠른 SSH 사용을 용이하게하도록 SSH 키를 설정하면 훨씬 쉽습니다.

다른 예 :

ls  | ssh desktopIpAddress pbcopy
pwd |  ssh desktopIpAddress pbcopy

편의를 위해 파이프 뒤에 필요한 텍스트를 줄이려면 bash 파일을 만들었습니다.

#!/bin/bash
ssh desktop pbcopy

제 경우에는 특별히 명명 된 키를 사용하고 있습니다

파일 이름을 cb (내 니모닉 (ClipBoard))로 저장했습니다 . 스크립트를 경로 어딘가에 놓고 실행 가능하고 보이도록 만드십시오.

ls | cb

3
나는 종종 vim에서 이것을한다. 이렇게 당신은 비주얼 모드에서 복사 할 무엇을 선택하려면, 다음을 입력 ::'<,'>w !ssh desktop pbcopy
마이크 브레넌

@MikeBrennan 텍스트를 선택했을 때 cmd + C (또는 설정 한 복사 키)를 누르지 않겠습니까? ...
Petr Peller

36
이와 같이 데스크탑에 고정 IP가 있고 ssh'd 상자에서 연결할 수있는 경우에만 실제로 작동합니다. 그것은 결코 그렇지 않습니다.
kqw

6
다른 방법은 쉽지 않습니까? ssh user @ remote 'commandThatMakesOutput'| pbcopy
rulio

-e none여기에 설명 된 ssh 플래그가 필요했습니다 . unix.stackexchange.com/questions/210615/…
Pat Myron

122

내가 가장 좋아하는 방법은 ssh [remote-machine] "cat log.txt" | xclip -selection c입니다. 이것은 원격에서 로컬로 ssh를 원하지 않거나 사용할 수 없을 때 가장 유용합니다.

Cygwin에서 편집하십시오 ssh [remote-machine] "cat log.txt" > /dev/clipboard.

편집 : nbren12의 유용한 의견 :

SSH 포트 전달을 사용하여 역방향 ssh 연결을 설정하는 것은 거의 항상 가능합니다. RemoteForward 127.0.0.1:2222 127.0.0.1:22local의 서버 항목에 추가 .ssh/config한 다음 ssh -p 2222 127.0.0.1원격 컴퓨터에서 실행 하면 연결이 로컬 컴퓨터로 리디렉션됩니다. – nbren12


6
+1 : 역방향 SSH 연결이 불가능할 때 다른 솔루션보다 훨씬 쉽습니다!
John Dibling

9
당신은 매우 간단한 솔루션에 대해 더 많은 것을 좋아할 만합니다!
Kamil Dziedzic

31
맥 OSX에 우리를 위해,ssh [remote-machine] "cat log.txt" | pbcopy
chowey

1
이 보고서에 따라 여기 , 내가 사용했다 cat윈도우 8 Cygwin에서 작업 할 내용 : ssh [remote-machine] "cat log.txt" | cat > /dev/clipboard(물론, 내 원격 명령이 아니었다 cat, 그것은 부랑자 가상 머신 내부에 뭔가 다른했다 그래서 실제로 RAN vagrant ssh -c "command" | cat > /dev/clipboard)
tiby

7
SSH 포트 전달을 사용하여 역방향 ssh 연결을 설정하는 것은 거의 항상 가능합니다. RemoteForward 127.0.0.1:2222 127.0.0.1:22local의 서버 항목에 추가 .ssh/config한 다음 ssh -p 2222 127.0.0.1원격 컴퓨터에서 실행 하면 연결이 로컬 컴퓨터로 리디렉션됩니다.
nbren12

30

역방향 ssh 연결이 필요없는 훌륭한 솔루션을 찾았습니다!

OSX 시스템에서 ssh X11 전달 및 XQuartz와 함께 원격 호스트에서 xclip을 사용할 수 있습니다.

이것을 설정하려면 :

  1. 설치 XQuartz를 (내가 함께 이런 짓 솔로 +의 pivotal_workstation :: xquartz 조리법 ,하지만 당신은 필요가 없습니다)
  2. XQuartz.app 실행
  3. XQuartz 환경 설정 열기 ( kb_command+ ,)
  4. 확인 "동기화 활성화""클립 보드 변경시 업데이트 판지를" 체크 XQuartz 환경 설정 윈도우 예제
  5. ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"

1
이것은 어떻게 다른가 ssh remote-host "echo 'hello from remote-host' | pbcopy? 다음과 같이 작동하면 훌륭한 답변이 될 것 ssh -X remote-host입니다. 원격 호스트에서 :echo 'hello from remote-host' | xclip -selection clipboard
kqw

5
@KasperSouren. 나는 그것이 당신이 바라고있는 방식으로 작동한다고 생각합니다. `| xclip`은 큰 따옴표 안에 있습니다.
gdw2

1
2016 년에는 이것이 최고의 최고의 솔루션입니다. 다른 역 SSH 기반 솔루션은 잊어 버리십시오.
shivams

1
단 한 번의 명령 으로이 작업을 수행하는 방법이 있습니까? ssh를 통해 대화 형 세션에서 원격 서버에 로그인 한 다음 로컬 클립 보드로 임의로 보낼 수 있기를 원합니다. 리버스 ssh가 필요합니까?
크 바스

2
@Kvass : -XSSH를 통한 X11 포워딩에 사용 하는 한 X11 프로그램은 위의 XQuartz 설정을 통해 클립 보드를 업데이트 할 수 있습니다. 일회용 명령을 통해 echo원격 호스트의 클립 보드 로 무언가를 보내는 것이 xclip작동하고 로컬 SSH 클라이언트 호스트와 동기화되어야 함 을 보여줍니다 . @ gdw2는 "이것은 | xclip큰 따옴표 안에 있습니다 "라고 말합니다 . 따라서 원격 서버에서 명령으로 실행되어 클립 보드에 무언가를 보냅니다.
TrinitronX

18

SSH 서버의 역방향 터널 포트

모든 기존 솔루션에는 다음이 필요합니다.

  • 클라이언트의 X11 (있는 경우) xclip 서버에서 작동) 또는
  • 클라이언트와 서버가 동일한 네트워크에 있어야합니다 (집에있는 컴퓨터에 액세스하려고하는 경우에는 해당되지 않음).

컴퓨터에 ssh하는 방법을 수정해야하지만 다른 방법이 있습니다.

나는 이것을 사용하기 시작했으며 그것이 보이는 것처럼 협박하는 곳은 없습니다.

클라이언트 (ssh 세션 시작)

ssh username@server.com -R 2000:localhost:2000

(힌트 : 키 바인딩을하지 않아도됩니다.)

클라이언트 (다른 ​​탭)

nc -l 2000 | pbcopy

참고 : 당신이 pbcopy없다면 그냥tee 그 파일에.

서버 (SSH 세션 내부)

cat some_useful_content.txt | nc localhost 2000

기타 노트

실제로 당신이 ssh 세션의 중간에 있더라도 터널을 시작할 수있는 방법이 있지만 실제로는 나쁘지 않은 것을 사람들을 놀라게하고 싶지 않습니다. 하지만 관심이 있으면 나중에 세부 정보를 추가하겠습니다


1
+1-꽤 깔끔합니다. 그러나-이 작업을 cat some_useful_content.txt | nc localhost 2000수행 하면 명령이 중단 된 것 같습니다. 수동으로 ctr-c를 중지해야합니다. 그러면 컨텐츠가 클라이언트 클립 / 페이스트 보드에 도착합니다
Alan Storm

1
누군가 다른 쪽 끝에서 데이터를 큐에서 제거 할 때까지 기다립니다.
Sridhar Sarnobat

사실 나는 당신의 질문을 오해했다고 생각합니다. 왜 그런지 잘 모르겠습니다.
Sridhar Sarnobat가

nc -l -p나를 위해 작동하지만 nc -l그렇지 않습니다. 그리고 @AlanStorm의 문제도 있습니다.
HappyFace

1
을 지정하여 netcat 매달려 문제를 해결했습니다 -c. brew가 설치 한 GNU netcat을 사용합니다.
HappyFace

7

xclipXSel을 포함하여 X11 선택 항목에 액세스 할 수있는 다양한 도구가 있습니다 . X11은 전통적으로 여러 선택 항목을 가지고 있으며 대부분의 프로그램은 클립 보드와 기본 선택 (동일하지 않음)에 대해 어느 정도 이해하고 있습니다. 이맥스는 2 차 선택에도 사용할 수 있지만 드물기는하지만 컷 버퍼로 무엇을해야할지 아무도 모릅니다 ...

$ xclip-도움말
사용법 : xclip [OPTION] [FILE] ...
읽기 또는 쓰기를 위해 X 서버 선택에 액세스하십시오.

  -i, -in 표준 입력 또는 파일에서 X 선택 영역으로 텍스트 읽기
                   (기본)
  -o, -out 선택 항목을 표준 출력으로 인쇄합니다 (일반적으로
                   파일 또는 프로그램에 배관)
  -l,-종료하기 전에 대기 할 선택 요청 수를 루프합니다.
  연결할 -d, -display X 디스플레이 (예 : localhost : 0 ")
  -h,-도움말 사용법 정보
      액세스 할 선택 선택 ( "기본", "보조", "클립 보드"또는 "버퍼 컷")
      -noutf8은 텍스트를 utf-8로 취급하지 않으며 오래된 유니 코드를 사용합니다.
      버전 정보
      -자동 오류 만, 백그라운드에서 실행 (기본값)
      -조용히 전경에서 달리고, 무슨 일이 일어나고 있는지 보여줘
      -상세 실행 주석

<astrand@lysator.liu.se>에 버그보고
$ xsel-도움말
사용법 : xsel [옵션]
X 선택을 조작하십시오.

기본적으로 현재 선택은 출력되며 둘 다인 경우 수정되지 않습니다
표준 입력 및 표준 출력은 터미널 (ttys)입니다. 그렇지 않으면,
표준 출력이 터미널이 아닌 경우 현재 선택이 출력됩니다.
(tty), 표준 입력 인 경우 표준 입력에서 선택
터미널이 아닙니다 (tty). 입력 또는 출력 옵션이 제공되면
프로그램은 요청 된 모드에서만 작동합니다.

입력과 출력이 모두 필요한 경우 이전 선택은
표준 입력의 내용으로 교체되기 전에 출력.

입력 옵션
  -a, --append 표준 입력을 선택에 추가
  -f, --follow 표준 입력이 증가함에 따라 선택에 추가
  -i, --input 선택 항목으로 표준 입력을 읽습니다.

출력 옵션
  -o, --output 선택 사항을 표준 출력에 씁니다.

동작 옵션
  -c, --clear 선택을 취소합니다
  -d, --delete 선택을 지우고
                        그것을 소유 한 응용 프로그램은 내용을 삭제합니다

선택 옵션
  -p, --primary PRIMARY 선택시 작동 (기본값)
  -s, --secondary SECONDARY 선택에서 작동
  -b, --clipboard CLIPBOARD 선택시 작동

  -k, --keep 선택을 수정하지 말고 PRIMARY를 만드십시오.
                        두 번째 선택은
                        종료시 선택된 프로그램.
  -x, --exchange PRIMARY 및 SECONDARY 선택을 교환합니다

X 옵션
  -디스플레이 표시 이름
                        X 서버에 대한 연결을 지정하십시오
  -t ms, --selectionTimeout ms
                        시간 초과를 밀리 초 단위로 지정하십시오.
                        선택을 검색해야합니다. 0 값
                        시간 초과 없음을 지정합니다 (기본값).

기타 옵션
  -l, --logfile 분리 할 때 오류를 기록 할 파일을 지정하십시오.
  -n, --nodetach 제어 터미널에서 분리하지 마십시오. 없이
                        이 옵션을 사용하면 xsel이 포크가 배경이됩니다.
                        입력, 교환 및 유지 모드에서 처리합니다.

  -h, --help이 도움말을 표시하고 종료
  -v, --verbose 정보 메시지를 인쇄합니다
  --version 버전 정보를 출력하고 종료

<conrad@vergenet.net>에 버그를 신고하십시오.

요컨대, 원하는 것에 따라 xclip -i/ xclip -o또는 xclip -i -sel clip/ xclip -o -sel clip또는 xsel -i/ xsel -o또는 xsel -i -b/을 시도해야합니다 xsel -o -b.


4
@ephemient의 게시물에 추가하려면 : xhost & xsel을 원격 호스트와 함께 사용하려면 다음과 같이 X11 Forwarding을 사용할 수 있습니다 ssh -C -X user@remote-host. 원격에서 xclip을 실행해도 작동하지 않는 X11Forwarding yes경우 원격 /etc/ssh/sshd_config파일에 설정되어 있는지 확인하십시오 . 또한 xauth원격쪽에 설치되어 있는지 확인하십시오 . 헤드리스 시스템의 경우 xauth및 을 설치할 수 있습니다 xvfb.
TrinitronX

여기의 설명을 추가 세부 사항 플러스 정력 키 바인딩은.
Tim Bunce

1
@TrinitronX 오 와우-벽에 머리를 두드리는 것에 대해 xvfb언급 해 주셔서 감사합니다 . 헤드리스 서버를 실행하고 있었으므로 X11이 실행되고 있지 않아야합니다!
Cam

5

이것은 SSH 리버스 터널, netcat 및 xclip 기반의 솔루션입니다.

먼저 워크 스테이션에서 스크립트 (예 : clipboard-daemon.sh)를 작성하십시오.

#!/bin/bash
HOST=127.0.0.1
PORT=3333

NUM=`netstat -tlpn 2>/dev/null | grep -c " ${HOST}:${PORT} "`
if [ $NUM -gt 0 ]; then
    exit
fi

while [ true ]; do
    nc -l ${HOST} ${PORT} | xclip -selection clipboard
done

백그라운드에서 시작합니다.

./clipboard-daemon.sh&

데이터의 일부를받은 후 xclip으로 nc 파이핑 출력을 시작하고 respawning 프로세스

그런 다음 원격 호스트에 ssh 연결을 시작하십시오.

ssh user@host -R127.0.0.1:3333:127.0.0.1:3333

원격 상자에 로그인 한 상태에서 다음을 시도하십시오.

echo "this is test" >/dev/tcp/127.0.0.1/3333

그런 다음 워크 스테이션에 붙여 넣기

물론 clipboard-daemon.sh를 먼저 시작한 다음 ssh 세션을 시작하는 랩퍼 스크립트를 작성할 수 있습니다. 이것이 나를 위해 작동하는 방법입니다. 즐겨.


이 솔루션은 저에게 가장 효과적이었습니다. 너무 복잡하지 않고 제대로 작동합니다.
Marcel Valdez Orozco

내 의견으로는 최고의 솔루션입니다. 보안에 영향을 미치는 역방향 ssh 연결 허용에 대해 걱정할 필요가 없으며 무한 루프가 좋습니다.
R. Taukulis

4

하나의 라이너는 아니지만 추가 ssh가 필요하지 않습니다 .

  • netcat필요한 경우 설치
  • 용어집 사용 :cat ~/some_file.txt | nc termbin.com 9999 . 그러면 출력이 termbin웹 사이트로 복사되고 URL이 출력으로 인쇄됩니다.
  • 컴퓨터에서 해당 URL을 방문하면 결과가 나타납니다.

물론 민감한 콘텐츠에는 사용하지 마십시오.


와우 매우 창의적인 솔루션입니다.
Sridhar Sarnobat

3

이 답변은 보안을 강화 하여 선택한 답변 을 모두 개발합니다 .

그 대답은 일반적인 형태를 논의했습니다

<command that makes output> | \
    ssh <user A>@<host A> <command that maps stdin to clipboard>

어디에서 보안이 부족 할 수있다하면에 ssh권한 허용 <user B>host B>sshhost A하고 실행할 수 있는 명령을 사용합니다.

물론 BA액세스 이미에 의해 문이 될 수 있습니다 ssh키, 그리고 심지어 암호가있을 수 있습니다. 그러나 다른 보안 계층은 예를 들어 호출 할 수없는 B에서 실행할 수 있는 허용 가능한 명령의 범위를 제한 할 수 있습니다. ( 키 가 그렇지 않을 때 특히 중요합니다.Arm -rf /ssh 에 비밀번호 합니다.

다행히도 명령 제한 또는 강제 명령ssh 이라는 내장 기능이 있습니다. ssh.com 또는이 serverfault.com 질문을 참조하십시오 .

아래 솔루션은 명령 제한 과 함께 일반 양식 솔루션을 보여줍니다.ssh 적용을 .

명령 제한이있는 솔루션 예 추가 된

이 보안 강화 솔루션은 일반적인 형식을 따릅니다. ssh세션에서 의 호출은 다음과 같습니다 host-B.

cat <file> | ssh <user-A>@<host A> to_clipboard

이것의 나머지 부분은 작동하도록 설정을 보여줍니다.

의 설정 ssh 명령 제한

사용자 계정이 Bis user-B이고 B에 ssh 키 id-clip가 있으며 일반적인 방법으로 생성되었다고 가정합니다 ( ssh-keygen).

그런 다음 user-Assh 디렉토리에 파일이 있습니다.

/home/user-A/.ssh/authorized_keys

키를 인식하고 연결을 id-clip허용 ssh합니다.

일반적으로 각 줄의 내용 authorized_keys은 정확히 공개 키 (예 :의 내용)입니다 id-clip.pub.

그러나, 공개 키 내용이 실행될 명령에 의해 (같은 행에) 추가되도록 명령 제한 을 시행 합니다.
우리의 경우 :

command="/home/user-A/.ssh/allowed-commands.sh id-clip",no-agent-forwarding,no-port-forwarding,no-user-rc,no-x11-forwarding,no-pty <content of file id-clip.pub>

지정된 명령 "/home/user-A/.ssh/allowed-commands.sh id-clip"전용 키 때마다 명령을 지정 즉, 실행 id-clip사용이 시작 ssh연결 host-A- 서면 어떤 명령없이 ssh명령 줄을 .

이 명령은 스크립트 파일을 나타내며 해당 스크립트 파일 allowed-commands.sh의 내용은

#/bin/bash
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.

Id=${1}

case "$SSH_ORIGINAL_COMMAND" in
    "to-clipboard")
          notify-send "ssh to-clipboard, from ${Id}"
        cat | xsel --display :0 -i -b
          ;;
    *)
        echo "Access denied"
        exit 1
        ;;
esac

ssh기계 를 처음 호출했을 B

... | ssh <user-A>@<host A> to_clipboard

문자열 to-clipboardallowed-commands.sh환경 변수 에 의해 전달됩니다 SSH_ORIGINAL_COMMAND. 또한 우리는 키만 액세스 id-clip하는 줄에서 키 이름을 전달 authorized_keys했습니다.id-clip .

라인

          notify-send "ssh to-clipboard, from ${Id}"

클립 보드가 작성되고 있음을 알려주는 팝업 메시지 상자 일뿐입니다. 보안 기능도 좋습니다. ( notify-send우분투 18.04에서 작동하며 아마도 다른 것은 아닙니다).

라인에서

cat | xsel --display :0 -i -b

--display :0프로세스에는 클립 보드가있는 자체 X 디스플레이가 없으므로 매개 변수 가 필요하므로 명시 적으로 지정해야합니다. 이 값 :0은 Wayland 윈도우 서버가있는 Ubuntu 18.04에서 작동합니다. 다른 설정에서는 작동하지 않을 수 있습니다. 표준 X 서버의 경우이 답변 이 도움 될 수 있습니다.

host-A /etc/ssh/sshd_config 매개 변수

마지막으로 /etc/ssh/sshd_config호스트 의 몇 가지 매개 변수는 A연결 권한과 ssh암호없이 -key 만 사용할 수 있도록 설정해야 합니다.

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

만들려면 sshd서버 설정을 다시 읽기

sudo systemctl restart sshd.service

또는

sudo service sshd.service restart

결론

그것을 설정하는 것이 약간의 노력이지만, 다른 기능 to-clipboard은 동일한 프레임 워크와 병렬로 구성 될 수 있습니다.


1
원격 포워드를 사용하는 Xsel은 i3을 로컬로 실행하는 Ubuntu 18.04에서 저에게 효과적이었습니다. X11 전달이 필요하지 않습니다.
Jay Stanley


2

터미널을 사용하는 OS X에 있고 원격 서버에서 ssh 's하고 텍스트 파일 또는 로그 또는 csv의 결과를 얻으려는 경우 가장 간단한 해결책은 다음과 같습니다.

1) Cmd-K터미널의 출력을 지우려면

2) cat <filename>파일 내용을 표시

3) Cmd-S터미널 출력 저장

파일의 첫 번째 줄과 마지막 줄을 수동으로 제거해야하지만이 방법은 설치할 다른 패키지, "역 터널"을 사용하고 고정 IP를 사용하는 것보다 조금 더 간단합니다.


내가 사용했던 유용한 기술에 +1하면 터미널 기록을 잃게됩니다. 언급 한 것처럼 첫 번째 / 마지막 줄 문제는 약간 어리 석습니다.
Alan Storm

@AlanStorm 동의
tw0000

이 방법의 더 중요한 문제는 터미널 버퍼가 유지하는 줄 수만 저장한다는 것입니다. 종종 문제가되지 않지만 로그 파일의 내용을 가져 오려고하면 용량이 부족할 수 있습니다.
오려고 부족할

그것은 @ Sridhar-Sarnobat 사실이며, 일반적으로 그다지 좋은 해결책은 아닙니다. 나는 단지 사용한다 scp!
tw0000
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.