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

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

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

pbcopy, pbpaste 

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

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

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

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

9 ответов


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

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

Edit: on 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 (Я сделал это с солист + pivotal_workstation::можно использовать рецепт, но не обязательно)
  2. Запустить XQuartz.app
  3. Открыть Настройки XQuartz (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&

он начнет выпуск труб nc в xclip и процесс восстановления после получения части данных

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

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

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

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

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