Получение элементов в локальном буфере обмена с удаленного сеанса SSH

Вопрос с Borderline ServerFault, но я программирую некоторые сценарии оболочки, поэтому сначала я пытаюсь:)

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

pbcopy, pbpaste 

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

  • Я использую компьютер A.
  • Я открываю окно терминала
  • я SSH для компьютера B
  • Я запускаю команду на компьютере B
  • Вывод компьютера B перенаправляется или автоматически копируется в компьютер. Буфер обмена.

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

Код полезен, но общие подходы также оценены.

Ответ 1

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

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

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

commandThatMakesOutput | ssh desktop pbcopy

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

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

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

ls  | ssh desktopIpAddress pbcopy
pwd |  ssh desktopIpAddress pbcopy

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

#!/bin/bash
ssh desktop pbcopy

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

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

ls | cb

Ответ 2

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

Изменить: на Cygwin ssh [remote-machine] "cat log.txt" > /dev/clipboard.

Ответ 3

Нашел отличное решение, которое не требует обратного подключения ssh!

Вы можете использовать xclip на удаленном хосте наряду с пересылкой ssh ​​X11 и XQuartz в системе OSX.

Чтобы установить это:

  • Установите XQuartz (я сделал это с помощью солист + пивовальная рабочая станция:: рецепт xquartz, но вам не нужно)
  • Запустить XQuartz.app
  • Откройте настройки XQuartz (kb_command + ,)
  • Убедитесь, что "Включить синхронизацию" и "Обновить карточку при изменении CLIPBOARD" отмечены XQuartz Preferences window example
  • ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"

Ответ 4

Существуют различные инструменты для доступа к выборам 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 happening
      -verbose     running commentary

Report bugs to <[email protected]>
$ 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 <[email protected]>.

Короче говоря, вы должны попробовать xclip -i/xclip -o или xclip -i -sel clip/xclip -o -sel clip или xsel -i/xsel -o или xsel -i -b/xsel -o -b, в зависимости от того, что вы хотите.

Ответ 5

Это мое решение, основанное на обратном туннеле SSH, netcat и xclip.

Сначала создайте script (например, 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 piping в процесс xclip и refawning после получения части данных

Затем запустите ssh-соединение с удаленным хостом:

ssh [email protected] -R127.0.0.1:3333:127.0.0.1:3333

Во время входа в удаленную папку попробуйте следующее:

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

затем попробуйте вставить на свою рабочую станцию ​​

Вы можете, конечно, написать wrapper script, который запускает clipboard-daemon.sh сначала, а затем ssh-сессию. Вот как это работает для меня. Наслаждайтесь.

Ответ 6

Если Tooltalk доступен для обеих систем, вы можете написать простое приложение Tooltalk для выполнения того, что вы хотите сделать.

Ответ 7

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

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

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