development

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

big-blog 2020. 6. 28. 17:40
반응형

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


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

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

pbcopy, pbpaste 

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

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

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

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


나는 같은 종류의 솔루션을 찾고 있었기 때문에이 스레드를 부활시키고 있으며, 나에게 맞는 것을 찾았습니다. 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

내가 가장 좋아하는 방법은 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


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

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

이것을 설정하려면 :

  1. XQuartz를 설치하십시오 (이 솔로이스트 + pivotal_workstation :: xquartz recipe로이 작업을 수행했지만 반드시 그럴 필요는 없습니다)
  2. XQuartz.app 실행
  3. XQuartz 환경 설정 열기 ( kb_command+ ,)
  4. 확인 "동기화 활성화""클립 보드 변경시 업데이트 판지를" 체크XQuartz 환경 설정 윈도우 예제
  5. ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"

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


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

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

  -i, -in 표준 입력 또는 파일에서 X 선택 영역으로 텍스트 읽기
                   (기본)
  -o, -out 선택 항목을 표준 출력으로 인쇄합니다 (일반적으로
                   파일 또는 프로그램에 배관)
  -l,-종료하기 전에 대기 할 선택 요청 수를 루프합니다.
  연결할 -d, -display X 디스플레이 (예 : localhost : 0 ")
  -h,-도움말 사용법 정보
      -액세스 할 선택 선택 ( "1 차", "2 차", "클립 보드"또는 "버퍼 컷")
      -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.


이것은 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&

It will start nc piping output to xclip and respawning process after receiving portion of data

Then start ssh connection to remote host:

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

While logged in on remote box, try this:

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

then try paste on your workstation

You can of course write wrapper script that starts clipboard-daemon.sh first and then ssh session. This is how it works for me. Enjoy.


Not a one-liner, but requires no extra ssh.

  • install netcat if necessary
  • use termbin: cat ~/some_file.txt | nc termbin.com 9999. This will copy the output to the termbin website and prints the URL to your output.
  • visit that url from your computer, you get your output

Of course, do not use it for sensitive content.


This answer develops both upon the chosen answer by adding more security.

That answer discussed the general form

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

Where security may be lacking is in the ssh permissions allowing <user B> on host B> to ssh into host A and execute any command.

Of course B to A access may already be gated by an ssh key, and it may even have a password. But another layer of security can restrict the scope of allowable commands that B can execute on A, e.g. so that rm -rf / cannot be called. (This is especially important when the ssh key doesn't have a password.)

Fortunately, ssh has a built-in feature called command restriction or forced command. See ssh.com, or this serverfault.com question.

The solution below shows the general form solution along with ssh command restriction enforced.

Example Solution with command restriction added

This security enhanced solution follows the general form - the call from the ssh session on host-B is simply:

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

The rest of this shows the setup to get that to work.

Setup of ssh command restriction

Suppose the user account on B is user-B, and B has an ssh key id-clip, that has been created in the usual way (ssh-keygen).

Then in user-A's ssh directory there is a file

/home/user-A/.ssh/authorized_keys

that recognizes the key id-clip and allows ssh connection.

Usually the contents of each line authorized_keys is exactly the public key being authorized, e.g., the contents of id-clip.pub.

However, to enforce command restriction that public key content is prepended (on the same line) by the command to be executed.
In our case:

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>

The designated command "/home/user-A/.ssh/allowed-commands.sh id-clip", and only that designated command, is executed whenever key id-clip is used initiate an ssh connection to host-A - no matter what command is written the ssh command line.

The command indicates a script file allowed-commands.sh, and the contents of that that script file is

#/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

The original call to ssh on machine B was

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

The string to-clipboard is passed to allowed-commands.sh by the environment variable SSH_ORIGINAL_COMMAND. Addition, we have passed the name of the key, id-clip, from the line in authorized_keyswhich is only accessed by id-clip.

The line

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

is just a popup messagebox to let you know the clipboard is being written - that's probably a good security feature too. (notify-send works on Ubuntu 18.04, maybe not others).

In the line

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

the parameter --display :0 is necessary because the process doesn't have it's own X display with a clipboard, so it must be specificied explicitly. This value :0 happens to work on Ubuntu 18.04 with Wayland window server. On other setups it might not work. For a standard X server this answer might help.

host-A /etc/ssh/sshd_config parameters

Finally a few parameters in /etc/ssh/sshd_config on host A that should be set to ensure permission to connect, and permission to use ssh-key only without password:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

To make the sshd server re-read the config

sudo systemctl restart sshd.service

or

sudo service sshd.service restart

conclusion

It's some effort to set it up, but other functions besides to-clipboard can be constructed in parallel the same framework.


@rhileighalmgren solution is good, but pbcopy will annoyingly copy last "\n" character, I use "head" to strip out last character to prevent this:

#!/bin/bash
head -c -1 |  ssh desktop pbcopy

My full solution is here : http://taylor.woodstitch.com/linux/copy-local-clipboard-remote-ssh-server/


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

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

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

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

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

참고 URL : https://stackoverflow.com/questions/1152362/how-to-send-data-to-local-clipboard-from-a-remote-ssh-session

반응형