Как отправить данные в локальный буфер обмена из удаленного сеанса SSH
пограничный вопрос ServerFault, но я Программирование некоторые сценарии оболочки, поэтому я сначала пытаюсь здесь:)
большинство * nixes имеют команду, которая позволит вам передавать / перенаправлять вывод в локальный буфер обмена / pasteboard и извлекать из него. В OS X эти команды являются
pbcopy, pbpaste
есть ли в любом случае, чтобы реплицировать эту функциональность во время SSHed на другой сервер? То есть,
- я использую компьютер А.
- открыть окно терминала
- Я SSH на компьютер B
- я запускаю команду на компьютере B
- выход компьютера B перенаправляется или автоматически копируется в буфер обмена компьютера A.
и да, я знаю, что я мог бы просто (содрогнуться) использовать мышь, чтобы выбрать текст из команды, но я так привык к рабочему процессу передачи вывода непосредственно в буфер обмена, что я хочу то же самое для моих удаленных сеансов.
код полезен, но также приветствуются общие подходы.
9 ответов
Я воскрешаю эту тему, потому что я искал такое же решение, и я нашел тот, который работает для меня. Это незначительная модификация предложения от OSX ежедневно.
в моем случае я использую терминал на своей локальной машине OSX для подключения к серверу linux через SSH. Как и OP, я хотел иметь возможность передавать небольшие фрагменты текста из терминала в локальный буфер обмена, используя только клавиатуру.
суть решения:
commandThatMakesOutput | ssh desktop pbcopy
при запуске в сеансе ssh на удаленный компьютер эта команда принимает вывод commandThatMakesOutput (например, ls, pwd) и передает вывод в буфер обмена локального компьютера (имя или IP "desktop"). Другими словами, он использует вложенный ssh: вы подключены к удаленному компьютеру через один сеанс ssh, вы выполняете команду там, и удаленный компьютер подключается к вашему рабочему столу через другой сеанс ssh и помещает текст на ваш буфер.
он требует, чтобы ваш рабочий стол был настроен как ssh-сервер (который я оставляю вам и google). Это намного проще, если вы настроили ssh-ключи для облегчения быстрого использования ssh, предпочтительно используя парольную фразу за сеанс или все, что требуется для вашей безопасности.
другие примеры:
ls | ssh desktopIpAddress pbcopy
pwd | ssh desktopIpAddress pbcopy
для удобства, я создал файл bash, чтобы сократить текст, необходимый после трубы:
#!/bin/bash
ssh desktop pbcopy
в моем случае, я использую специально назвали ключ
Я сохранил его с именем файла cb (моя мнемоника (буфер обмена). Поместите скрипт где-нибудь на своем пути, сделайте его исполняемым и вуаля:
ls | cb
мой любимый способ-это ssh [remote-machine] "cat log.txt" | xclip -selection c
. Это наиболее полезно, когда вы не хотите (или не можете) SSH с удаленного на локальный.
Edit: on Cygwin ssh [remote-machine] "cat log.txt" > /dev/clipboard
.
Edit: полезный комментарий от nbren12:
почти всегда можно настроить обратное ssh-соединение с помощью переадресации портов SSH. Просто добавьте
RemoteForward 127.0.0.1:2222 127.0.0.1:22
к записи сервера в вашем локальном.ssh/config
, а затем выполнитьssh -p 2222 127.0.0.1
на удаленной машине, которая затем перенаправляет подключение к локальный компьютер. - nbren12
найдено отличное решение, которое не требует обратного ssh-соединения!
вы можете использовать xclip на удаленном хосте вместе с SSH X11 forwarding & XQuartz в системе OSX.
для этого:
- установить XQuartz (Я сделал это с солист + pivotal_workstation::можно использовать рецепт, но не обязательно)
- Запустить XQuartz.app
- Открыть Настройки XQuartz (+
,
) - убедится "Включить Синхронизацию" и "обновление картона при изменении буфера обмена" это
ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"
существуют различные инструменты для доступа к выборам 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's happening -verbose running commentary Report bugs to <astrand@lysator.liu.se>
$ 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 <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
в зависимости от того, что вы хотите.
Это мое решение на основе обратного туннеля 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-сервере
все существующие решения либо нужно:
- 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 есть способ запустить туннель, но я не хочу отпугнуть людей от того, что на самом деле не так плохо, как кажется. Но я добавлю детали позже, если увижу какой-либо интерес
не один-лайнер, но не требует дополнительного ssh.
- установить
netcat
при необходимости - использовать termbin:
cat ~/some_file.txt | nc termbin.com 9999
. Это скопирует выходные данные вtermbin
веб-сайт и печатает URL-адрес для вывода. - посетите этот url с Вашего компьютера, вы получите свой вывод
конечно, не используйте его для конфиденциального контента.
@rhileighalmgren решение хорошо, но pbcopy будет раздражающе копировать последний символ "\n", я использую "head", чтобы удалить последний символ, чтобы предотвратить это:
#!/bin/bash
head -c -1 | ssh desktop pbcopy
мое полное решение здесь : http://taylor.woodstitch.com/linux/copy-local-clipboard-remote-ssh-server/
самое простое решение из всех, если вы находитесь на OS X с помощью терминала, и Вы были ssh вокруг в удаленном сервере и хотите, чтобы захватить результаты текстового файла или журнала или csv, просто:
1) Cmd-K
чтобы очистить выход терминала
2) cat <filename>
для отображения содержимого файла
3) Cmd-S
для сохранения вывода терминала
у вас будет вручную удалить первую строку и последнюю строку файла, но этот метод немного проще, чем полагаться на другие устанавливаемые пакеты, "обратные туннели" и пытаться иметь статический IP и т. д.