Скопіювати вхід у буфер обміну через SSH?


33

Ось мій випадок використання:

  • Мене часто підключають до інших комп’ютерів через SSH для роботи, і мені часто потрібно копіювати та вставляти документи / текст із сервера в локальні редактори для написання прикладів та обміну текстом.
  • Часто, якщо текст є досить малим, я просто скопіюю висновок із своєї термінальної програми (на даний момент gnome-terminal) і вставляю його.
  • Однак, якщо мова йде про цілі документи, мої варіанти досить обмежені. Я можу скопіювати документ з елементами, або scpйого на локальну машину.

Чи є спосіб використовувати таку програму, xclipяка дозволить мені скопіювати віддалений stdinв буфер обміну локального сервера? Щось до ефекту:

cat myconffile.conf | sed {...} | copy-over-ssh-to-local-clipboard

було б дивним. Чи існує щось, щоб зробити це можливим?

Відповіді:


20

Якщо ви запускаєте ssh за допомогою переадресації X, це прозоро: віддалені команди (в тому числі xclip) мають доступ до вашого X-сервера (включаючи його клавіатуру). Переконайтеся, що у вас є і ForwardX11 yesна вашому сервері, ~/.ssh/configі X11Forwarding yesна сервері sshd_config(залежно від ваших дистрибутивів, ці параметри можуть бути увімкнено або вимкнено за умовчанням)

<myconffile.conf sed {...} | xclip -i

Є й інші способи роботи з віддаленими файлами, які можуть бути зручнішими, наприклад, встановлення віддалених каталогів на локальній машині за допомогою SSHfs або відкриття віддалених файлів у Emacs з Tramp . Якщо у вас встановлено ssh та FUSE та встановлено SSHfs, SSHfs так само просто mkdir ~/net/myserver; sshfs myserver:/ ~/net/myserver. Якщо у вас встановлено ssh та встановлено Emacs, Tramp так само просто, як і відкриття /myserver:/path/to/file.


1
Будь-які вразливості безпеки для запуску речей таким чином за замовчуванням у файлі conf?
Naftuli Kay

Ні. Весь х11 трафік передається через канал SSH.
Шадур

2
@TKKocheran Не дуже. На стороні сервера немає. Що стосується клієнта, то трохи, оскільки він дає адміністратору сервера шлях до вашого клієнта, але в 99% випадків адміністратор сервера має спосіб все одно; див. Якщо хтось увійшов до SSH на моєму комп’ютері, чи можу я отримати доступ до його комп'ютера?
Жил 'ТАК - перестань бути злим'

7

Вам не потрібно нічого особливого; оскільки xclipпрацює над stdin, просто

ssh remotehost xclip < myconf.conf

Чому його потрібно модифікувати sed? sshє прозорим для даних, коли він не використовується як термінал, і зазвичай використовується в трубопроводах, таких як

tar cfz - somedir | ssh remotehost 'cd destdir; tar xfz -'`

Чи є спосіб це зробити в рамках наявного сеансу SSH? Я дійсно вважаю за краще не відкривати інше вікно терміналу, якщо у мене вже є одне відкрите для відповідної машини.
Naftuli Kay

І sed` є лише прикладом, якщо я хотів би виконати будь-яку обробку на stdinпопередньому копіюванні в буфер обміну, я хотів би цю опцію.
Naftuli Kay

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

@NaftuliKay Щодо рішення, яке працює у вашому звичайному сеансі SSH, дивіться мою відповідь .
таній


3

якщо на вашій локальній машині працює Windows (7+), ви можете просто використовувати це з CommandLine:

ssh user@server cat /home/user/file | clip

1

~ / .ssh / config:

Host REMOTEHOST
    ...
    ForwardX11 yes

/ etc / ssh / sshd_config:

X11Forwarding yes

баш:

$ xclip -o | ssh REMOTEHOST 'DISPLAY=:0 xclip -i'

1

Дуже схоже на рішення @ d-raev та @ william-casarin, однак, воно відрізняється, тому я ділюсь тим, що працювало на мене.

Команда

ssh user@host "cat <myconffile.conf" | xclip -sel clip

Пояснення

Це використовується sshдля створення захищеного тунелю, увійдіть до user@ hostабо ip, а потім виконайте, catщоб надрукувати вміст, <myconffile.confщоб stdoutпотім передати його команді xclip -sel clipна локальній машині, яка вміщує вміст <myconffile.confу буфер обміну на вашій локальній машині.

Використання прикладу в реальному світі

Я використовую цю командну структуру для таких завдань, як вставлення ssh-клавіш у github (що дозволяє простий ctrl-V або вибір вставлення після запуску команди) з Bash на Ubuntu 16.04 та 18.04. Перевірте man ssh, man catі man xclipдля поведінки і опціонних деталей.


Це навіть працює для копіювання з безголових серверів, де xclipне буде працювати, оскільки немає X.
таній

0

У мене є аналогічна проблема з lxterminalвставкою буфера обміну LUbuntu (тестовані різні термінали) до sshсеансу. Якщо буфер обміну містить більше ніж 100 байтів, час та час закінчення сеансу закінчується.

Якщо я підключуюсь через ssh майже до будь-якого сервера CentOS 5.x, а потім підключаюся до цільового сервера, вставка буфера обміну працює без жодних проблем для будь-якого розумного розміру даних.


0

Копіювання з безголового сервера в локальний буфер обміну з вашого звичайного сеансу SSH:

  1. Встановіть ncatна локальному та віддаленому пристрої. (На віддаленій машині ви також можете зробити це ncчи просто telnet, але на локальній машині нам потрібні варіанти виконання команд ( -c/ -e), які недоступні ncу звичайних дистрибутивах, як Debian та Ubuntu.)

    apt install nmap
    
  2. На локальній машині налаштуйте сервер, який прослуховує локальний інтерфейс, який буде копіювати вміст, що надходить через порт 10009, у ваш буфер обміну X:

    ncat --keep-open --listen --sh-exec "xclip -selection clipboard" localhost 10009
    

    Або скористайтеся еквівалентною скороченою версією:

    ncat -klc "xclip -sel c" localhost 10009
    
  3. SSH у віддалену машину таким чином, що зворотний тунель встановлюється від порту 10008 віддаленої машини до порту 10009 на вашій локальній машині (де ваш сервер слухає). Ви можете використовувати цей сеанс SSH для своєї звичайної роботи.

    ssh -R 10008:localhost:10009 user@example.com
    
  4. Коли ви хочете скопіювати вміст файлу з віддаленої машини в місцевий буфер обміну, виконайте в оболонці SSH:

    ncat --send-only localhost 10008 < file.txt
    

    І звичайно, це приємніше, коли пакується як ярлик або скрипт оболонки. Ми могли б назвати це rclip"[копіювати в] віддалений буфер обміну" за аналогією з відомим xclip.

Переваги

  • Не потрібно відкривати ще одне сеанс SSH на віддаленій машині.

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

Безпека

Ми робимо ncat -l localhost 10009для сервера, це означає, що він слухає лише мережевий інтерфейс з localhostIP-адресою. Цей інтерфейс локального циклу дозволяє лише з'єднання з вашої власної машини (включаючи, у цьому випадку, ті зворотні тунелі через SSH). Тож навіть якщо ви не знаходитесь за брандмауером, ваш порт 10009 не піддається впливу будь-кого в Інтернеті.

Джерело

Адаптований з суті dergachev / ssh-forward-clipboard.md для роботи для Linux. Цей суть також містить інструкції, як зробити зворотний тунель SSH за замовчуванням.


-1

https://secure.wikimedia.org/wikipedia/en/wiki/Base64

Ви можете конвертувати дані буфера обміну за допомогою програми Base64 в текст ASCII. Потім ви можете просунути це всередині вже наявного SSH-з'єднання.


Навіщо перетворюватися на що-небудь? Це вже текст у цьому випадку, і навіть якби він був двійковим, не було б причин, щоб ви не могли надіслати його через такий конвеєр.
Калеб

буфер обміну міг би містити двійкові дані, наприклад: компільована програма
LanceBaynes

Так, це могло, але чому це буде проблемою? Бінарні дані можуть передаватися через трубопровід і ssh тунель.
Калеб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.