Как отправить данные в локальный буфер обмена из удаленного сеанса SSH - PullRequest
125 голосов
/ 20 июля 2009

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

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

pbcopy, pbpaste 

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

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

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

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

Ответы [ 10 ]

96 голосов
/ 19 сентября 2013

Мой любимый способ - 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:22 к записи сервера в вашем локальном .ssh/config, а затем выполните ssh -p 2222 127.0.0.1 на удаленном компьютере, который затем перенаправит соединение на локальный компьютер. - nbren12

69 голосов
/ 08 июля 2011

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

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

ls | cb
27 голосов
/ 12 апреля 2013

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

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

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

  1. Установка XQuartz (я сделал это с soloist + pivotal_workstation :: xquartz recipe , но вам не нужно)
  2. Запустите XQuartz.app
  3. Открыть настройки XQuartz (kb_command + ,)
  4. Убедитесь, что отмечены «Включить синхронизацию» и «Обновление Pasteboard при изменении CLIPBOARD» XQuartz Preferences window example
  5. ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"
7 голосов
/ 18 апреля 2018

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

7 голосов
/ 21 июля 2009

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

3 голосов
/ 13 марта 2019

Этот ответ развивается как на выбранный ответ , добавляя дополнительную безопасность.

В этом ответе обсуждается общая форма

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

Если безопасность может быть недостаточной, это разрешения ssh, позволяющие <user B> на host B> до ssh в host A и выполнять любую команду.

Конечно, доступ B к A может быть уже закрыт с помощью ключа ssh и даже может иметь пароль. Но другой уровень безопасности может ограничивать область допустимых команд, которые B может выполнять на A, например, так что rm -rf / нельзя назвать. (Это особенно важно, когда ssh клавиша не не имеет пароля.)

К счастью, ssh имеет встроенную функцию, называемую ограничение команды или принудительная команда . См. ssh.com или этот вопрос serverfault.com .

В приведенном ниже решении показано решение общей формы вместе с ssh ограничением команды принудительно.

Пример решения с ограничением команды добавлено

Это решение повышенной безопасности имеет общий вид - вызов из сеанса ssh на host-B просто:

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

Остальная часть этого показывает настройку, чтобы заставить это работать.

Настройка ограничения ssh на команды

Предположим, учетная запись пользователя на B имеет значение user-B, а B имеет ssh-ключ id-clip, созданный обычным способом (ssh-keygen).

Затем в каталоге user-A ssh есть файл

/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-clipboard передается в allowed-commands.sh переменной окружения SSH_ORIGINAL_COMMAND. Кроме того, мы передали имя ключа id-clip из строки в authorized_keys, доступ к которой имеет только id-clip.

Линия

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

- это просто всплывающее окно с сообщением о том, что буфер обмена пишется - это, вероятно, также хорошая функция безопасности. (notify-send работает на Ubuntu 18.04, возможно, не на других).

В строке

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

параметр --display :0 необходим, потому что у процесса нет собственного X-дисплея с буфером обмена, так что это должно быть конкретно указано. Это значение :0 работает в Ubuntu 18.04 с сервером окон Wayland. На других установках это может не работать. Для стандартного X-сервера этот ответ может помочь.

host-A /etc/ssh/sshd_config параметры

Наконец, несколько параметров в /etc/ssh/sshd_config на хосте A, которые должны быть установлены для обеспечения разрешения на подключение и разрешения на использование ssh -ключа только без пароля:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

Чтобы сервер sshd перечитал конфигурацию

sudo systemctl restart sshd.service

или

sudo service sshd.service restart

заключение

Требуется некоторая настройка, но другие функции, кроме to-clipboard, могут быть построены параллельно в той же самой структуре.

3 голосов
/ 05 апреля 2018

Не однострочный, но не требует дополнительного ssh .

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

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

3 голосов
/ 03 октября 2017

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

1 голос
/ 17 июля 2018

Самое простое решение из всех, если вы работаете в OS X и используете Terminal, и вы работаете на удаленном сервере и хотите получить результаты текстового файла, журнала или CSV, просто:

1) Cmd-K для очистки вывода терминала

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

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

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

1 голос
/ 22 октября 2015

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...