Як надсилати дані до місцевого буфера обміну з віддаленого сеансу 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. Як і в ОП, мені хотілося передати невеликі шматочки тексту з терміналу в мій місцевий буфер обміну, використовуючи лише клавіатуру.

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

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

3
Я часто до цього in vim. Для цього виберіть те, що ви хочете скопіювати у візуальному режимі, а потім введіть::'<,'>w !ssh desktop pbcopy
Майк Бренан

@MikeBrennan Коли ви вибрали текст, чому б вам просто не натиснути cmd + C (або будь-яку клавішу копіювання, яку ви встановили)? ...
Петро Пеллер

36
Як це, це справді працює лише тоді, коли ваш робочий стіл має статичну IP-адресу і до нього можна дістатися з вікна, в яке ви входите. Це для мене ніколи не буває.
kqw

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 (я це робив за допомогою соліста + 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"

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. Я вважаю, це працює так, як ви сподіваєтесь. The | | xclip` знаходиться всередині подвійних лапок.
gdw2

1
У 2016 році це, очевидно, найкраще рішення, яке не викликає запах. Забудьте інші рішення, засновані на зворотному коду.
шивам

1
Чи є спосіб зробити це без одноразової команди? Я хочу ввійти на свій віддалений сервер під час інтерактивного сеансу через ssh, а потім мати змогу надсилати до мого локального буфера обміну довільно. Для цього потрібен зворотний ssh?
Квас

2
@Kvass: Поки ви використовуєте -Xдля переадресації X11 через SSH, програми X11 зможуть оновити буфер обміну через налаштування XQuartz, наведені вище. Одноразова команда полягає в тому, щоб продемонструвати, що надсилання чого-небудь через echoбуфер обміну віддаленого хоста xclipпрацює і має синхронізуватися з вашим локальним хостом клієнта SSH. Зауважте, як говорить @ gdw2: " | xclipВсередині подвійних лапок". Таким чином, він буде виконуватись як команда на віддаленому сервері, щоб надіслати щось до буфера обміну.
TrinitronX

18

Порт зворотного тунелю на ssh-сервері

Усі існуючі рішення або потребують:

  • X11 на клієнті (якщо у вас є, xclipна сервері працює чудово) або
  • клієнт і сервер знаходяться в одній мережі (що не так, якщо ви працюєте, намагаючись отримати доступ до домашнього комп'ютера).

Ось ще один спосіб зробити це, хоча вам потрібно буде змінити спосіб входу в комп’ютер.

Я почав використовувати це, і це ніде не так страшно, як виглядає, так що спробуйте.

Клієнт (запуск 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, встановлений пивом.
HappyFace

7

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

$ xclip -допомога
Використання: xclip [OPTION] [FILE] ...
Отримайте доступ до вибору сервера X для читання чи запису.

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

Повідомте про помилки на <astrand@lysator.liu.se>
$ xsel -допомога
Використання: xsel [параметри]
Маніпулюйте виділенням X.

За замовчуванням поточний вибір виводиться і не змінюється, якщо обидва
стандартний вхід і стандартний вихід - це клеми (ttys). Інакше
поточний вибір виводиться, якщо стандартний вихід не є терміналом
(tty), і вибір встановлюється зі стандартного вводу, якщо стандартний вхід
не є терміналом (tty). Якщо вказані будь-які параметри вводу або виводу
програма веде себе лише в запитуваному режимі.

Якщо потрібні і вхід, і вихід, попередній вибір є
вихід перед тим, як замінити вміст стандартного вводу.

Параметри введення
  -a, --додайте Додавання стандартного вводу до вибору
  -f, - нижче Додайте до вибору при збільшенні стандартного введення
  -i, --вхід Читання стандартного вводу у вибір

Варіанти виводу
  -o, - вихід Виведіть вибір на стандартний вихід

Варіанти дій
  -c, - ясно Очистити вибір
  -d, - видалити Попросити видалити вибір і це
                        програма, що володіє ним, видаляє її вміст

Параметри вибору
  -p, --primary Операція з вибору PRIMARY (за замовчуванням)
  -s, - секунда Операція на вибір SECONDARY
  -b, --clipboard Робота з вибором CLIPBOARD

  -k, --keep Не змінюйте виділення, але робіть ПЕРВИЧНИЙ
                        та ВТОРИЧНІ виділення зберігаються навіть після
                        програми вони були відібрані під час виходу.
  -x, - обмін Обмінятись ПЕРВІЙНИМ та СЕКУНДАРНІМ виділеннями

X варіанти
  - відображення імені дисплея
                        Вкажіть з'єднання з сервером X
  -t мс, --selectionTimeout мс
                        Вкажіть час очікування в мілісекундах, протягом якого
                        вибір повинен бути отриманий. Значення 0 (нуль)
                        не вказує час очікування (за замовчуванням)

Різні варіанти
  -l, --logfile Вкажіть файл для реєстрації помилок, коли вони від'єднані.
  -n, --nodetach Не відривайтесь від керуючого терміналу. Без
                        цей параметр, xsel буде форк, щоб стати фоном
                        обробляти в режимах введення, обміну та зберігання.

  -h, --help Показати цю довідку та вийти
  -v, --verbose Друк інформативних повідомлень
  --версія Інформація про вихідну версію та вихід

Повідомте про помилки на <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, залежно від того, що ви хочете.


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-адресу зі свого комп’ютера, ви отримаєте результат

Звичайно, не використовуйте його для чутливого контенту.


Нічого, це дуже креативне рішення.
Шрідхар Сарнобат

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

Припустимо, що в обліковому записі користувача Bє user-B, а в B є ключ ssh id-clip, створений звичайним способом ( ssh-keygen).

Тоді в user-Assh каталозі є файл

/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

Найпростіше рішення з усіх випадків, якщо ви використовуєте ОС X за допомогою терміналу, і ви розмовляєте на віддаленому сервері і хочете схопити результати текстового файлу або журналу або csv, просто:

1) Cmd-Kдля очищення виходу терміналу

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

3) Cmd-Sдля збереження вихідного терміналу

Вам доведеться вручну видалити перший і останній рядок файлу, але цей метод трохи простіший, ніж покладатися на інші пакунки, які потрібно встановити, "зворотні тунелі" та намагання стати статичного IP-адреси тощо.


+1 за корисну техніку, якою я користувався сам, трохи це змушує вас втратити свою історію терміналів і (як уже згадувалося) проблема першого / останнього рядка трохи непомітна.
Алан Шторм

Погоджено @AlanStorm
tw0000

Більш істотна проблема цього підходу полягає в тому, що він збереже лише кількість рядків, які зберігає ваш термінальний буфер. Часто це не проблема, але якщо ви намагаєтеся захопити вміст файлу журналу, то у вас може не вистачити можливостей,
Шрідар Сарнобат

Це правда @ Шрідхар-Сарнобат, загалом це не дуже вдале рішення. Я просто використовую scp!
tw0000
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.