Как отправить данные в локальный буфер обмена из удаленного сеанса SSH


пограничный вопрос ServerFault, но я Программирование некоторые скрипты оболочки, поэтому я пытаюсь здесь сначала :)

большинство * nixes имеют команду, которая позволит вам передавать/перенаправлять вывод в локальный буфер обмена/pasteboard и извлекать из него. В OS X эти команды

pbcopy, pbpaste 

есть ли в любом случае, чтобы реплицировать эту функциональность в то время как SSHed на другой сервер? То есть,

  1. я использую компьютер А.
  2. открыть окно терминала
  3. Я SSH на компьютер B
  4. я запускаю команду на компьютере B
  5. вывод компьютера B перенаправляется или автоматически копируется в буфер обмена компьютера A.

и да, я знаю, что могу просто (содрогнуться) использовать мышь для выбора текста из команды, но я так привык к рабочему процессу вывода pipping непосредственно в буфер обмена, что я хочу то же самое для моих удаленных сеансов.

код полезен, но общие подходы также приветствуются.

9 108

9 ответов:

Я воскрешаю эту тему, потому что я искал такое же решение, и я нашел тот, который работает для меня. Это незначительная модификация предложения от OSX Daily.

в моем случае я использую терминал на моей локальной машине OSX для подключения к серверу linux через SSH. Как и OP, я хотел иметь возможность передавать небольшие фрагменты текста из терминала в мой локальный буфер обмена, используя только клавиатуру.

суть решения:

commandThatMakesOutput | ssh desktop pbcopy

при запуске в сеансе ssh на удаленном компьютере, эта команда принимает вывод commandThatMakesOutput (например, ls, pwd) и передает вывод в буфер обмена локального компьютера (имя или IP "desktop"). Другими словами, он использует вложенный ssh: вы подключены к удаленному компьютеру через один сеанс ssh, вы выполняете команду там, а удаленный компьютер подключается к вашему рабочему столу через другой сеанс ssh и помещает текст в ваш буфер.

он требует, чтобы ваш рабочий стол был настроен как ssh-сервер (который я оставляю вам и google). Это намного проще, если вы настроили ключи ssh для облегчения быстрого использования ssh, предпочтительно используя парольную фразу для каждого сеанса или все, что требуется для вашей безопасности.

другие примеры:

ls  | ssh desktopIpAddress pbcopy
pwd |  ssh desktopIpAddress pbcopy

для удобства, я создал файл bash, чтобы сократить текст, необходимый после трубы:

#!/bin/bash
ssh desktop pbcopy

в моем случае, я использую специально назвали ключ

Я сохранил его с именем файла cb (моя мнемоника (буфер обмена). Поместите скрипт где-нибудь на своем пути, сделайте его исполняемым и вуаля:

ls | cb

мой любимый способ-это ssh [remote-machine] "cat log.txt" | xclip -selection c. Это наиболее полезно, когда вы не хотите (или не можете) SSH с удаленного на локальный.

редактировать: на Cygwin ssh [remote-machine] "cat log.txt" > /dev/clipboard.

Edit: полезный комментарий от nbren12:

почти всегда можно настроить обратное соединение ssh с помощью перенаправления портов SSH. Просто добавьте RemoteForward 127.0.0.1:2222 127.0.0.1:22 к записи сервера в вашем локальном .ssh/config, а затем выполнить ssh -p 2222 127.0.0.1 на удаленной машине, которая затем перенаправляет подключение к локальный компьютер. - nbren12

найдено отличное решение, которое не требует обратного ssh соединения!

вы можете использовать xclip на удаленном хосте, а также SSH X11 forwarding & XQuartz в системе OSX.

для этого:

  1. установить XQuartz (Я сделал это с soloist + pivotal_workstation:: XQuartz recipe, но не обязательно)
  2. Запустить XQuartz.приложение
  3. Настройки Открытия Можно Использовать (kb_command+,)
  4. убедится "Включить Синхронизацию" и "обновление картона при изменении буфера обмена" это XQuartz Preferences window example
  5. ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"

существуют различные инструменты для доступа к выбору X11, в том числе xclip и XSel. Обратите внимание, что X11 традиционно имеет несколько вариантов выбора, и большинство программ имеют некоторое представление как о буфере обмена, так и о первичном выборе (которые не совпадают). Emacs также может работать со вторичным выбором, но это редко, и никто не знает, что делать с буферами вырезания...

$ xclip -help
Usage: xclip [OPTION] [FILE]...
Access an X server selection for reading or writing.

  -i, -in          read text into X selection from standard input or files
                   (default)
  -o, -out         prints the selection to standard out (generally for
                   piping to a file or program)
  -l, -loops       number of selection requests to wait for before exiting
  -d, -display     X display to connect to (eg localhost:0")
  -h, -help        usage information
      -selection   selection to access ("primary", "secondary", "clipboard" or "buffer-cut")
      -noutf8      don't treat text as utf-8, use old unicode
      -version     version information
      -silent      errors only, run in background (default)
      -quiet       run in foreground, show what's happening
      -verbose     running commentary

Report bugs to <astrand@lysator.liu.se>
$ xsel -help
Usage: xsel [options]
Manipulate the X selection.

By default the current selection is output and not modified if both
standard input and standard output are terminals (ttys).  Otherwise,
the current selection is output if standard output is not a terminal
(tty), and the selection is set from standard input if standard input
is not a terminal (tty). If any input or output options are given then
the program behaves only in the requested mode.

If both input and output is required then the previous selection is
output before being replaced by the contents of standard input.

Input options
  -a, --append          Append standard input to the selection
  -f, --follow          Append to selection as standard input grows
  -i, --input           Read standard input into the selection

Output options
  -o, --output          Write the selection to standard output

Action options
  -c, --clear           Clear the selection
  -d, --delete          Request that the selection be cleared and that
                        the application owning it delete its contents

Selection options
  -p, --primary         Operate on the PRIMARY selection (default)
  -s, --secondary       Operate on the SECONDARY selection
  -b, --clipboard       Operate on the CLIPBOARD selection

  -k, --keep            Do not modify the selections, but make the PRIMARY
                        and SECONDARY selections persist even after the
                        programs they were selected in exit.
  -x, --exchange        Exchange the PRIMARY and SECONDARY selections

X options
  --display displayname
                        Specify the connection to the X server
  -t ms, --selectionTimeout ms
                        Specify the timeout in milliseconds within which the
                        selection must be retrieved. A value of 0 (zero)
                        specifies no timeout (default)

Miscellaneous options
  -l, --logfile         Specify file to log errors to when detached.
  -n, --nodetach        Do not detach from the controlling terminal. Without
                        this option, xsel will fork to become a background
                        process in input, exchange and keep modes.

  -h, --help            Display this help and exit
  -v, --verbose         Print informative messages
  --version             Output version information and exit

Please report bugs to <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&

оно начнет выход трубопровода НК к процессу склип и респавнинг после получать часть данных

затем запустите 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. Вот как это работает для меня. Наслаждаться.

обратный туннельный порт на 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-сессия есть способ начать туннель, но я не хочу отпугивать людей от того, что на самом деле не так плохо, как кажется. Но я добавлю детали позже, если увижу какой-либо интерес

не один-лайнер, но не требует дополнительного ssh.

  • установить netcat при необходимости
  • использовать termbin:cat ~/some_file.txt | nc termbin.com 9999. Это скопирует выходные данные в termbin веб-сайт и печатает URL-адрес для вашего вывода.
  • посетите этот url с Вашего компьютера, вы получите свой выход

конечно, не используйте его для конфиденциального контента.

@rhileighalmgren решение хорошее, но pbcopy будет раздражающе копировать последний символ "\n", я использую "head", чтобы удалить последний символ, чтобы предотвратить это:

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

мое полное решение здесь : http://taylor.woodstitch.com/linux/copy-local-clipboard-remote-ssh-server/

самое простое решение из всех, если вы находитесь на OS X с помощью терминала, и Вы были ssh'ING вокруг в удаленном сервере и хотите, чтобы захватить результаты текстового файла или журнала или csv, просто:

1) Cmd-K чтобы очистить выход терминала

2) cat <filename> для отображения содержимого файла

3) Cmd-S для сохранения вывода терминала

вы будете иметь, чтобы удалить первую строку и последнюю строку файла, но этот способ немного проще, чем полагаться на другие устанавливаемые пакеты, "обратные туннели" и пытаться иметь статический IP и т. д.