Скопировать вход в буфер обмена по SSH?

33

Вот мой пример использования:

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

Есть ли способ использовать программу, например, xclipкоторая позволит мне скопировать удаленно stdinв буфер обмена локального X-сервера? Что-то с эффектом:

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?
Нафтули Кей
Нет. Весь трафик x11 пересылается через канал SSH.
Шадур
2
@TKKocheran Не совсем. На стороне сервера нет. На стороне клиента, немного, в том смысле, что он дает администратору сервера доступ к вашему клиенту, но в 99% случаев администратор сервера в любом случае имеет путь; Посмотрите, если кто-то вошел в SSH на моем компьютере, могу ли я получить доступ к его компьютеру?
Жиль "ТАК - перестань быть злым"
7

Вам не нужно ничего особенного; так как xclipработает stdin, просто

ssh remotehost xclip < myconf.conf

Зачем его нужно модифицировать с помощью sed? sshпрозрачен для данных, когда не используется в качестве терминала, и обычно используется в конвейерах, таких как

tar cfz - somedir | ssh remotehost 'cd destdir; tar xfz -'`
geekosaur
источник
Есть ли способ сделать это из существующего сеанса SSH? Я бы действительно предпочел не открывать другое окно терминала, если оно уже открыто для рассматриваемой машины.
Нафтули Кей
И sed` приведен только в качестве примера, если я хотел бы выполнить какую-либо обработку для stdinперед копированием в буфер обмена, я бы хотел эту опцию.
Нафтули Кей
Нет, нет способа внедрить данные в существующий sshсеанс (это было бы не очень безопасно, если бы вы могли). Вы можете настроить ssh ControlMasterматериал для мультиплексирования дополнительных соединений поверх существующего, но на самом деле это не то, что нужно новичкам, и вы все равно делаете это потом, переключаясь на другой локальный терминал и выполняя указанную выше команду (которая не открывает новый окно терминала).
geekosaur
@NaftuliKay Для решения, которое работает в вашей обычной сессии SSH, см. Мой ответ .
Танус
5

Вот как вы могли бы сделать это на OSX с вашей локальной машины

ssh remotehost.com "<some/file.txt" | pbcopy
Уильям Казарин
источник
3

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

ssh user@server cat /home/user/file | clip
d.raev
источник
1

~ / .Ssh / конфигурации:

Host REMOTEHOST
    ...
    ForwardX11 yes

/ И т.д. / SSH / sshd_config:

X11Forwarding yes

Баш:

$ xclip -o | ssh REMOTEHOST 'DISPLAY=:0 xclip -i'
superqwerty
источник
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для поведения и опционных деталей.

Джейсон Р Стивенс CFA
источник
Это даже работает для копирования с безголовых серверов, где xclipне будет работать, поскольку нет X.
Tanius
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 никому не доступен в Интернете.

Источник

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

tanius
источник
-1

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

Вы можете конвертировать данные буфера обмена с помощью Base64 в текст ASCII. Затем вы можете протолкнуть это через уже существующее соединение SSH.

LanceBaynes
источник
Зачем конвертировать во что угодно? В данном случае это уже текст, и даже если бы он был двоичным, не было бы никакой причины, по которой вы не могли бы отправить его по конвейеру, как этот.
Калеб
буфер обмена может содержать двоичные данные, например: скомпилированное приложение
LanceBaynes
Да, может, но с чем это может быть проблемой? Двоичные данные могут передаваться через канал и ssh-туннель.
Калеб