Получение элементов в локальном буфере обмена с удаленного сеанса SSH
Вопрос с Borderline ServerFault, но я программирую некоторые сценарии оболочки, поэтому сначала я пытаюсь:)
В большинстве * nixes есть команда, которая позволит вам передавать/перенаправлять вывод в локальный буфер обмена/картон и извлекать из него. В OS X эти команды
pbcopy, pbpaste
Есть ли способ реплицировать эту функцию, пока SSHed на другой сервер? То есть
- Я использую компьютер A.
- Я открываю окно терминала
- я SSH для компьютера B
- Я запускаю команду на компьютере B
- Вывод компьютера B перенаправляется или автоматически копируется в компьютер. Буфер обмена.
И да, я знаю, что могу просто (содрогнуться) использовать мою мышь, чтобы выбрать текст из этой команды, но я настолько привык к потоку вывода вывода непосредственно в буфер обмена, что я хочу того же для своего удаленного сессий.
Код полезен, но общие подходы также оценены.
Ответы
Ответ 1
Я воскрешаю этот поток, потому что я искал одно и то же решение, и я нашел тот, который работает для меня. Это незначительная модификация предложения OSX Daily.
В моем случае я использую Terminal на моей локальной машине 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 (my mnemonic (ClipBoard). Поместите script где-нибудь на ваш путь, сделайте его исполняемым и voila:
ls | cb
Ответ 2
Мой любимый способ - ssh [remote-machine] "cat log.txt" | xclip -selection c
. Это наиболее полезно, если вы не хотите (или не можете) ssh от удаленного к локальному.
Изменить: на Cygwin ssh [remote-machine] "cat log.txt" > /dev/clipboard
.
Ответ 3
Нашел отличное решение, которое не требует обратного подключения ssh!
Вы можете использовать xclip на удаленном хосте наряду с пересылкой ssh X11 и XQuartz в системе OSX.
Чтобы установить это:
- Установите XQuartz (я сделал это с помощью солист + пивовальная рабочая станция:: рецепт xquartz, но вам не нужно)
- Запустить XQuartz.app
- Откройте настройки XQuartz (
+ ,
)
- Убедитесь, что "Включить синхронизацию" и "Обновить карточку при изменении CLIPBOARD" отмечены
![XQuartz Preferences window example]()
-
ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"
Ответ 4
Существуют различные инструменты для доступа к выборам 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 happening
-verbose running commentary
Report bugs to <[email protected]>
$ 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 <[email protected]>.
Короче говоря, вы должны попробовать xclip -i
/xclip -o
или xclip -i -sel clip
/xclip -o -sel clip
или xsel -i
/xsel -o
или xsel -i -b
/xsel -o -b
, в зависимости от того, что вы хотите.
Ответ 5
Это мое решение, основанное на обратном туннеле SSH, netcat и xclip.
Сначала создайте script (например, 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 piping в процесс xclip и refawning после получения части данных
Затем запустите ssh-соединение с удаленным хостом:
ssh [email protected] -R127.0.0.1:3333:127.0.0.1:3333
Во время входа в удаленную папку попробуйте следующее:
echo "this is test" >/dev/tcp/127.0.0.1/3333
затем попробуйте вставить на свою рабочую станцию
Вы можете, конечно, написать wrapper script, который запускает clipboard-daemon.sh сначала, а затем ssh-сессию. Вот как это работает для меня. Наслаждайтесь.
Ответ 6
Если Tooltalk доступен для обеих систем, вы можете написать простое приложение Tooltalk для выполнения того, что вы хотите сделать.
Ответ 7
@rhileighalmgren решение хорошо, но pbcopy будет досадно копировать последний символ "\n", я использую "head", чтобы вырезать последний символ, чтобы предотвратить это:
#!/bin/bash
head -c -1 | ssh desktop pbcopy
Мое полное решение находится здесь: http://taylor.woodstitch.com/linux/copy-local-clipboard-remote-ssh-server/