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

161

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

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

pbcopy, pbpaste 

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

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

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

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

Алан Сторм
источник

Ответы:

89

Я воскрешаю эту ветку, потому что я искал такое же решение, и я нашел то, которое подходит мне. Это небольшая модификация предложения от 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
rhileighalmgren
источник
3
Я часто к этому в VIM. Для этого выберите то, что вы хотите скопировать в визуальном режиме, а затем введите::'<,'>w !ssh desktop pbcopy
Майк Бреннан
@MikeBrennan Когда у вас выделен текст, почему бы вам просто не нажать cmd + C (или любую другую клавишу копирования, которую вы установили)? ...
Петр Пеллер
36
Таким образом, он действительно работает только тогда, когда ваш рабочий стол имеет статический IP-адрес и доступен из коробки, в которую вы вставили ssh'd. Это никогда не так для меня.
Кв
6
Разве не было бы проще? ssh user @ remote 'commandThatMakesOutput' | pbcopy
rulio
Мне нужен был -e noneфлаг ssh, описанный здесь: unix.stackexchange.com/questions/210615/…
Пэт Майрон
122

Мой любимый способ 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

Доминикас Мостаускис
источник
6
+1: намного проще, чем другие решения, когда обратное соединение SSH невозможно!
Джон Диблинг
9
Вы заслуживаете больше лайков за это чрезвычайно простое решение!
Камиль Дзедзич
31
Для тех из нас, кто на Mac OSX,ssh [remote-machine] "cat log.txt" | pbcopy
chowey
1
Согласно этому отчету здесь , я должен был использовать , catчтобы получить эту работу на Cygwin Windows 8: ssh [remote-machine] "cat log.txt" | cat > /dev/clipboard(конечно, моя удаленная команда не была cat, это было что - то еще внутри бродячей виртуальной машины , так что я на самом деле бежали vagrant ssh -c "command" | cat > /dev/clipboard)
Tiby
7
Это почти всегда возможно установить обратное соединение SSH с помощью перенаправления SSH порта. Просто добавьте RemoteForward 127.0.0.1:2222 127.0.0.1:22к серверам запись в вашем локальном компьютере .ssh/config, а затем выполните ssh -p 2222 127.0.0.1на удаленном компьютере, который затем перенаправит соединение на локальный компьютер.
nbren12
30

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

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

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

  1. Установите XQuartz (я сделал это с помощью рецепта soloist + pivotal_workstation :: xquartz , но это не обязательно)
  2. Запустите XQuartz.app
  3. Открыть настройки XQuartz ( kb_command+ ,)
  4. Убедитесь , что «Включить синхронизацию» и «Обновить Гипсокартонные при изменении CLIPBOARD» проверяются Пример окна настроек XQuartz
  5. ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"
TrinitronX
источник
1
Чем это отличается от ssh remote-host "echo 'hello from remote-host' | pbcopy? Это был бы отличный ответ, если бы он работал примерно так: ssh -X remote-hostзатем на удаленном хосте:echo 'hello from remote-host' | xclip -selection clipboard
kqw
5
@KasperSouren. Я считаю, что это работает, как вы надеетесь. `| xclip` находится внутри двойных кавычек.
gdw2
1
В 2016 году это, безусловно, лучшее решение без излишеств. Забудьте другие решения на основе обратного ssh.
Шивамс
1
Есть ли способ сделать это без единой команды? Я хочу войти на свой удаленный сервер в интерактивном сеансе через ssh и затем иметь возможность произвольной отправки в локальный буфер обмена. Требуется ли обратный SSH?
Квас
2
@Kvass: Пока вы используете -Xдля пересылки X11 через SSH, программы X11 смогут обновлять ваш буфер обмена с помощью настроек XQuartz, указанных выше. Одноразовая команда должна продемонстрировать, что отправка чего-либо через echoбуфер обмена удаленного хоста через xclipработает и должна синхронизироваться с вашим локальным клиентом SSH. Обратите внимание, что @ gdw2 говорит: « | xclipВнутри двойных кавычек». Таким образом, он выполнит команду на удаленном сервере для отправки чего-либо в буфер обмена.
TrinitronX
18

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

Шридхар Сарнобат
источник
1
+1 - это довольно аккуратно. Тем не менее - cat some_useful_content.txt | nc localhost 2000команда, кажется, зависает, когда я делаю это. Мне нужно вручную ctr-c, чтобы остановить его, и только тогда контент попадает в мой клиентский клип / монтажный диск
Alan Storm
1
Он будет ждать, пока кто-то не снимет данные с другого конца.
Шридхар Сарнобат
На самом деле я думаю, что я неправильно понял ваш вопрос. Я не уверен, почему это происходит.
Шридхар Сарнобат
nc -l -pу меня работает, а просто nc -lнет. И у меня тоже есть проблема @AlanStorm.
HappyFace
1
Я решил проблему зависания netcat, указав -c. Я использую GNU Netcat, установленный Brew.
HappyFace
7

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

$ xclip -help
Использование: xclip [ОПЦИЯ] [ФАЙЛ] ...
Доступ к выбору X-сервера для чтения или записи.

  -i, -in читать текст в X выбор из стандартного ввода или файлов
                   (дефолт)
  -o, -out выводит выборку на стандартный вывод (обычно для
                   трубопровод к файлу или программе)
  -l, -loops количество запросов на выборку для ожидания перед выходом
  -d, -display X дисплей для подключения (например, localhost: 0 ")
  -h, -help информация об использовании
      выбор выбора для доступа («первичный», «вторичный», «буфер обмена» или «обрезка буфера»)
      -noutf8 не обрабатывать текст как utf-8, используйте старый юникод
      версия версии
      Только ошибки, работают в фоновом режиме (по умолчанию)
      тихо бегать на переднем плане, показывать, что происходит
      подробный текущий комментарий

Сообщайте об ошибках на <astrand@lysator.liu.se>
$ xsel -help
Использование: xsel [варианты]
Управлять выбором X

По умолчанию текущий выбор выводится и не изменяется, если оба
Стандартный вход и стандартный вывод - это клеммы (ttys). В противном случае,
текущий выбор выводится, если стандартный вывод не является терминалом
(tty), и выбор устанавливается из стандартного ввода, если стандартный ввод
не является терминалом (tty). Если указаны какие-либо параметры ввода или вывода,
программа ведет себя только в запрошенном режиме.

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

Варианты ввода
  -a, --append Добавить стандартный ввод к выделению
  -f, --follow Добавить к выделению при увеличении стандартного ввода
  -i, --input Считать стандартный ввод в выборку.

Варианты вывода
  -o, --output Записать выбор в стандартный вывод

Варианты действий
  -c, --clear Очистить выбор
  -d, --delete Запросить очистку выбора и
                        приложение, владеющее им, удаляет его содержимое

Варианты выбора
  -p, --primary Использовать при выборе PRIMARY (по умолчанию)
  -s, - Secondary Действовать на ВТОРОЙ выбор
  -b, --clipboard Работать с выбором CLIPBOARD

  -k, --keep Не изменять выбор, но сделать ПЕРВИЧНЫЙ
                        и ВТОРОЙ выбор сохраняются даже после
                        программы они были выбраны при выходе.
  -x, --exchange Обмениваются ПЕРВИЧНЫМИ и ВТОРИЧНЫМИ выборами

X варианты
  --display отображаемое имя
                        Укажите соединение с X-сервером
  -t мс, --selectionTimeout мс
                        Укажите время ожидания в миллисекундах, в течение которого
                        выбор должен быть восстановлен. Значение 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, в зависимости от того, что вы хотите.

ephemient
источник
4
Чтобы добавить @ephemient пост «s: Для использования Xclip & xsel с удаленным хостом, вы можете использовать X11 Forwarding так: ssh -C -X user@remote-host. Если запуск xclip на удаленной стороне не работает, убедитесь, что X11Forwarding yesон установлен в удаленном /etc/ssh/sshd_configфайле. Также убедитесь, что xauthустановлен на удаленной стороне. Для безголовой машины вы можете установить xauthи xvfb.
TrinitronX
Вот описание с дополнительными деталями плюс привязки клавиш vim.
Тим Банс
1
@TrinitronX Ух ты! - бьюсь головой о стену, спасибо за xvfbупоминание. Я работал безголовый сервер, поэтому X11, должно быть, не работал!
Cam
5

Это мое решение на основе обратного туннеля 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-соединения, которое имеет последствия для безопасности, а бесконечный цикл - приятное прикосновение.
Р. Таукулис
4

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

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

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

maxbellec
источник
Вау, это очень креативное решение.
Шридхар Сарнобат
3

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

Этот ответ обсуждался в общем виде

<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

Предположим, что учетная запись пользователя Bis 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-key только без пароля:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

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

sudo systemctl restart sshd.service

или

sudo service sshd.service restart

вывод

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

Крейг Хикс
источник
1
Xsel с удаленной переадресацией был единственным ответом, который работал для меня на Ubuntu 18.04 с i3 локально. Пересылка X11 не требуется.
Джей Стэнли
2

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

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

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

Тейлор Хокс
источник
2

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

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

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

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

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

tw0000
источник
+1 за полезную технику, которую я использовал сам, но она вынуждает вас потерять историю вашего терминала и (как уже упоминалось) проблема с первой / последней строкой немного сложная.
Алан Сторм
Согласовано @AlanStorm
tw0000
Более существенная проблема с этим подходом состоит в том, что он сохранит только количество строк, которые сохранит ваш терминальный буфер. Часто это не проблема, но если вы пытаетесь получить содержимое файла журнала, то у вас может не
хватить места
Это правда @ Шридхар-Сарнобат, это не очень хорошее решение в целом. Я просто использую scp!
12:00