Cara mengirim data ke clipboard lokal dari sesi SSH jarak jauh

161

Pertanyaan Borderline ServerFault, tapi saya memprogram beberapa skrip shell, jadi saya coba di sini dulu :)

Kebanyakan * nixes memiliki perintah yang akan membiarkan Anda mem-pipe / mengarahkan output ke clipboard / pasteboard lokal, dan mengambil dari yang sama. Pada OS X perintah ini adalah

pbcopy, pbpaste 

Apakah ada cara untuk mereplikasi fungsi ini ketika SSHed ke server lain? Itu adalah,

  1. Saya menggunakan Komputer A.
  2. Saya membuka jendela terminal
  3. I SSH ke Komputer B
  4. Saya menjalankan perintah di Komputer B
  5. Output dari Komputer B diarahkan atau secara otomatis disalin ke clipboard Computer A.

Dan ya, saya tahu saya bisa (gemetar) menggunakan mouse saya untuk memilih teks dari perintah, tapi saya sudah terbiasa dengan alur kerja pipping output langsung ke clipboard yang saya ingin sama untuk sesi jarak jauh saya.

Kode bermanfaat, tetapi pendekatan umum juga dihargai.

Alan Storm
sumber

Jawaban:

89

Saya menghidupkan kembali utas ini karena saya telah mencari solusi yang sama, dan saya telah menemukan yang cocok untuk saya. Ini modifikasi kecil untuk saran dari OSX Daily .

Dalam kasus saya, saya menggunakan Terminal pada mesin OSX lokal saya untuk terhubung ke server linux melalui SSH. Seperti OP, saya ingin dapat mentransfer sedikit teks dari terminal ke clipboard lokal saya, hanya menggunakan keyboard.

Inti dari solusi:

commandThatMakesOutput | ssh desktop pbcopy

Saat dijalankan dalam sesi ssh ke komputer jarak jauh, perintah ini mengambil output dari commandThatMakesOutput (mis. Ls, pwd) dan menyalurkan output ke clipboard komputer lokal (nama atau IP "desktop"). Dengan kata lain, ini menggunakan nested ssh: Anda terhubung ke komputer jarak jauh melalui sesi satu ssh, Anda menjalankan perintah di sana, dan komputer jarak jauh terhubung ke desktop Anda melalui sesi ssh yang berbeda dan menempatkan teks ke clipboard Anda.

Ini membutuhkan desktop Anda untuk dikonfigurasi sebagai server ssh (yang saya serahkan kepada Anda dan google). Jauh lebih mudah jika Anda telah mengatur kunci ssh untuk memfasilitasi penggunaan ssh cepat, lebih disukai menggunakan frasa sandi per sesi, atau apa pun yang dibutuhkan keamanan Anda.

Contoh lain:

ls  | ssh desktopIpAddress pbcopy
pwd |  ssh desktopIpAddress pbcopy

Untuk kenyamanan, saya telah membuat file bash untuk mempersingkat teks yang diperlukan setelah pipa:

#!/bin/bash
ssh desktop pbcopy

Dalam kasus saya, saya menggunakan kunci bernama khusus

Saya menyimpannya dengan nama file cb (my mnemonic (ClipBoard). Letakkan skrip di suatu tempat di jalur Anda, buat itu dapat dieksekusi dan voila:

ls | cb
rhileighalmgren
sumber
3
Saya sering melakukan ini di vim. Untuk melakukannya, pilih apa yang ingin Anda salin dalam mode visual, lalu ketik::'<,'>w !ssh desktop pbcopy
Mike Brennan
@ MikeBrennan Ketika Anda memilih teks, mengapa Anda tidak cukup menekan cmd + C (atau tombol salin apa pun yang telah Anda tetapkan)? ...
Petr Peller
36
Seperti ini hanya berfungsi ketika desktop Anda memiliki IP statis dan dapat dijangkau dari kotak yang Anda gunakan. Itu tidak pernah terjadi pada saya.
kqw
6
Bukankah sebaliknya lebih mudah? ssh user @ remote 'commandThatMakesOutput' | pbcopy
ruleio
Saya membutuhkan -e nonebendera ssh yang dijelaskan di sini: unix.stackexchange.com/questions/210615/…
Pat Myron
122

Cara favorit saya adalah ssh [remote-machine] "cat log.txt" | xclip -selection c. Ini sangat berguna ketika Anda tidak ingin (atau tidak bisa) ssh dari jarak jauh ke lokal.

Sunting: di Cygwin ssh [remote-machine] "cat log.txt" > /dev/clipboard.

Sunting: Komentar bermanfaat dari nbren12:

Hampir selalu mungkin untuk mengatur koneksi ssh terbalik menggunakan penerusan port SSH. Cukup tambahkan RemoteForward 127.0.0.1:2222 127.0.0.1:22ke entri server di lokal Anda .ssh/config, dan kemudian jalankan ssh -p 2222 127.0.0.1pada mesin jarak jauh, yang kemudian akan mengarahkan kembali koneksi ke mesin lokal. - nbren12

Dominykas Mostauskis
sumber
6
+1: Jauh lebih mudah daripada solusi lain ketika koneksi SSH terbalik tidak memungkinkan!
John Dibling
9
Anda layak mendapatkan lebih banyak suka untuk solusi yang sangat sederhana ini!
Kamil Dziedzic
31
Bagi kita di Mac OSX,ssh [remote-machine] "cat log.txt" | pbcopy
chowey
1
Sesuai laporan ini di sini , saya harus menggunakan catini untuk bekerja di cygwin Windows 8: ssh [remote-machine] "cat log.txt" | cat > /dev/clipboard(tentu saja, perintah jarak jauh saya tidak cat; itu adalah sesuatu yang lain di dalam mesin virtual gelandangan jadi saya benar-benar berlari vagrant ssh -c "command" | cat > /dev/clipboard)
tiby
7
Hal ini hampir selalu mungkin untuk setup koneksi ssh terbalik menggunakan port SSH forwarding. Tambahkan saja RemoteForward 127.0.0.1:2222 127.0.0.1:22entri server di lokal Anda .ssh/config, dan kemudian jalankan ssh -p 2222 127.0.0.1pada mesin jarak jauh, yang kemudian akan mengarahkan kembali koneksi ke mesin lokal.
nbren12
30

Menemukan solusi hebat yang tidak memerlukan koneksi ssh terbalik!

Anda dapat menggunakan xclip pada host jarak jauh, bersama dengan ssh penerusan X11 & XQuartz pada sistem OSX.

Untuk mengatur ini:

  1. Instal XQuartz (saya melakukan ini dengan solois + pivotal_workstation :: resep xquartz , tetapi Anda tidak harus)
  2. Jalankan XQuartz.app
  3. Buka Preferensi XQuartz ( kb_command+ ,)
  4. Pastikan "Aktifkan Sinkronisasi" dan "Perbarui Papan Tulis ketika perubahan CLIPBOARD" dicentang Contoh jendela Preferensi XQuartz
  5. ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"
TrinitronX
sumber
1
Bagaimana ini berbeda ssh remote-host "echo 'hello from remote-host' | pbcopy? Ini akan menjadi jawaban yang sangat baik jika itu akan bekerja seperti ini: ssh -X remote-hostkemudian pada host jarak jauh:echo 'hello from remote-host' | xclip -selection clipboard
kqw
5
@KasperSouren. Saya percaya itu berhasil seperti yang Anda harapkan. `| xclip` ada di dalam tanda kutip ganda.
gdw2
1
Di tahun 2016, ini jelas solusi terbaik, tanpa embel-embel. Lupakan solusi berbasis reverse-ssh lainnya.
shivams
1
Apakah ada cara untuk melakukan ini tanpa menjadi perintah satu kali? Saya ingin masuk ke server jarak jauh saya dalam sesi interaktif melalui ssh dan kemudian dapat mengirim ke clipboard lokal saya secara sewenang-wenang. Apakah itu membutuhkan ssh terbalik?
Kvass
2
@Kvass: Selama Anda menggunakan -XX11 Forwarding melalui SSH, program X11 akan dapat memperbarui clipboard Anda melalui pengaturan XQuartz di atas. Perintah satu kali adalah untuk menunjukkan bahwa mengirim sesuatu melalui echoke clipboard host jarak jauh via xclipberfungsi dan harus disinkronkan ke host klien SSH lokal Anda. Catatan seperti @ gdw2 mengatakan, "Ada | xclipdi dalam tanda kutip ganda". Dengan demikian, itu akan dieksekusi sebagai perintah pada server jauh untuk mengirim sesuatu ke clipboard itu.
TrinitronX
18

Membalikkan port terowongan pada server ssh

Semua solusi yang ada perlu:

  • X11 pada klien (jika Anda memilikinya, xclippada server berfungsi dengan baik) atau
  • klien dan server berada di jaringan yang sama (yang tidak terjadi jika Anda sedang bekerja mencoba mengakses komputer di rumah Anda).

Berikut cara lain untuk melakukannya, meskipun Anda harus memodifikasi cara Anda ssh ke komputer.

Saya sudah mulai menggunakan ini dan itu sama sekali tidak mengintimidasi seperti kelihatannya jadi cobalah.

Klien (startup sesi ssh)

ssh username@server.com -R 2000:localhost:2000

(petunjuk: jadikan ini pengikat kunci sehingga Anda tidak perlu mengetiknya)

Klien (tab lain)

nc -l 2000 | pbcopy

Catatan: jika Anda tidak memilikinya pbcopymaka cukup teeke file.

Server (di dalam sesi SSH)

cat some_useful_content.txt | nc localhost 2000

Catatan lain

Sebenarnya bahkan jika Anda berada di tengah sesi ssh ada cara untuk memulai sebuah terowongan tetapi saya tidak ingin menakut-nakuti orang dari apa yang sebenarnya tidak seburuk kelihatannya. Tetapi saya akan menambahkan detailnya nanti jika saya melihat minat

Sridhar Sarnobat
sumber
1
+1 - itu cukup rapi. Namun - cat some_useful_content.txt | nc localhost 2000perintahnya sepertinya hang ketika saya melakukan ini. Saya perlu secara manual ctr-c untuk menghentikannya, dan hanya saat itulah konten sampai ke klip / papan tulis klien saya
Alan Storm
1
Itu akan menunggu sampai seseorang membagikan data di ujung lainnya.
Sridhar Sarnobat
Sebenarnya saya pikir saya salah mengerti pertanyaan Anda. Saya tidak yakin mengapa itu terjadi.
Sridhar Sarnobat
nc -l -pbekerja untuk saya, tetapi nc -ltidak. Dan saya punya masalah @AlanStorm juga.
HappyFace
1
Saya memecahkan masalah menggantung netcat dengan menentukan -c. Saya menggunakan GNU netcat yang diinstal oleh brew.
HappyFace
7

Ada berbagai alat untuk mengakses pilihan X11, termasuk xclip dan XSel . Perhatikan bahwa X11 secara tradisional memiliki banyak pilihan, dan sebagian besar program memiliki pemahaman tentang clipboard dan pemilihan utama (yang tidak sama). Emacs dapat bekerja dengan seleksi sekunder juga, tapi itu jarang terjadi, dan tidak ada yang benar-benar tahu apa yang harus dilakukan dengan buffer cut ...

$ xclip -help
Penggunaan: xclip [OPTION] [FILE] ...
Akses pilihan server X untuk membaca atau menulis.

  -i, -di baca teks ke dalam pemilihan X dari input standar atau file
                   (default)
  -o, -out mencetak pilihan ke standar keluar (umumnya untuk
                   perpipaan ke file atau program)
  -l, -lihat jumlah permintaan pemilihan untuk menunggu sebelum keluar
  -d, -display X display untuk terhubung (mis. localhost: 0 ")
  -h, informasi penggunaan -help
      -pilihan pemilihan untuk mengakses ("primer", "sekunder", "clipboard" atau "buffer-cut")
      -noutf8 jangan memperlakukan teks sebagai utf-8, gunakan unicode lama
      Informasi versi -versi
      Kesalahan -silent saja, berjalan di latar belakang (default)
      -Diam berjalan di latar depan, tunjukkan apa yang terjadi
      -tentang komentar berjalan

Laporkan bug ke <[email protected]>
$ xsel -bantuan
Penggunaan: xsel [opsi]
Memanipulasi pilihan X.

Secara default, pilihan saat ini adalah keluaran dan tidak diubah jika keduanya
input standar dan output standar adalah terminal (ttys). Jika tidak,
pilihan saat ini adalah keluaran jika keluaran standar bukan terminal
(tty), dan pemilihan diatur dari input standar jika input standar
bukan terminal (tty). Jika ada opsi input atau output yang diberikan maka
program hanya berlaku dalam mode yang diminta.

Jika input dan output diperlukan maka pilihan sebelumnya adalah
output sebelum digantikan oleh isi input standar.

Opsi input
  -a, --append Menambahkan input standar ke seleksi
  -f, --follow Tambahkan ke pilihan saat input standar bertambah
  -i, --input Baca input standar ke dalam seleksi

Opsi keluaran
  -o, --output Tulis pilihan ke output standar

Opsi tindakan
  -c, --clear Hapus pilihan
  -d, --delete Meminta agar seleksi dihapus dan itu
                        aplikasi yang memilikinya menghapus isinya

Pilihan pilihan
  -p, --primary Operasikan pada pilihan PRIMARY (default)
  -s, --secondary Operasikan pada pilihan SECONDARY
  -b, --clipboard Operasikan pada pilihan CLIPBOARD

  -k, --keep Jangan memodifikasi pilihan, tetapi buat PRIMARY
                        dan pilihan SECONDARY tetap ada bahkan setelah
                        program yang mereka pilih saat keluar.
  -x, --exchange Tukarkan pilihan PRIMARY dan SECONDARY

Opsi X
  --display displayname
                        Tentukan koneksi ke server X
  -t ms, --selectionTimeout ms
                        Tentukan batas waktu dalam milidetik di mana
                        pemilihan harus diambil. Nilai 0 (nol)
                        menentukan tidak ada batas waktu (default)

Opsi lain-lain
  -l, --logfile Tentukan file yang akan dicatat kesalahan saat dilepaskan.
  -n, --nodetach Jangan lepaskan dari terminal pengendali. Tanpa
                        opsi ini, xsel akan bercabang menjadi latar belakang
                        proses dalam mode input, pertukaran, dan simpan.

  -h, --help Tampilkan bantuan ini dan keluar
  -v, --verbose Mencetak pesan informatif
  --versi informasi versi keluaran dan keluar

Silakan laporkan bug ke <[email protected]>.

Singkatnya, Anda harus mencoba xclip -i/ xclip -oatau xclip -i -sel clip/ xclip -o -sel clipatau xsel -i/ xsel -oatau xsel -i -b/ xsel -o -b, tergantung pada apa yang Anda inginkan.

singkat
sumber
4
Untuk menambah @ephemient posting 's: Untuk penggunaan xclip & xsel dengan host remote, Anda dapat menggunakan X11 Forwarding seperti: ssh -C -X user@remote-host. Jika menjalankan xclip di sisi jarak jauh sepertinya tidak berfungsi, pastikan X11Forwarding yessudah diatur dalam /etc/ssh/sshd_configfile jarak jauh . Pastikan xauthjuga dipasang di sisi jarak jauh. Untuk mesin tanpa kepala, Anda dapat menginstal xauthdan xvfb.
TrinitronX
Berikut ini deskripsi dengan detail ekstra plus ikatan kunci vim.
Tim Bunce
1
@ TrititronX oh wow - membenturkan kepalaku ke dinding, terima kasih untuk xvfbmenyebutkannya. Saya menjalankan server tanpa kepala, jadi X11 pasti tidak berjalan!
Cam
5

Ini adalah solusi saya berdasarkan reverse tunnel SSH, netcat dan xclip.

Pertama buat skrip (mis. Clipboard-daemon.sh) di workstation Anda:

#!/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

dan mulai di latar belakang.

./clipboard-daemon.sh&

Ini akan mulai nc piping output ke xclip dan proses respawning setelah menerima bagian dari data

Kemudian mulai koneksi ssh ke host jarak jauh:

ssh user@host -R127.0.0.1:3333:127.0.0.1:3333

Saat masuk di kotak jauh, coba ini:

echo "this is test" >/dev/tcp/127.0.0.1/3333

lalu coba tempel di workstation Anda

Anda tentu saja dapat menulis skrip wrapper yang memulai clipboard-daemon.sh terlebih dahulu dan kemudian sesi ssh. Beginilah cara kerjanya untuk saya. Nikmati.

Krzysztof Księżyk
sumber
Solusi ini adalah yang terbaik bagi saya. tidak terlalu rumit dan berfungsi dengan baik.
Marcel Valdez Orozco
Solusi terbaik menurut saya. Anda tidak perlu khawatir tentang memungkinkan koneksi ssh terbalik yang memiliki implikasi keamanan, dan infinite loop adalah sentuhan yang bagus.
R. Taukulis
4

Bukan satu-liner, tetapi tidak memerlukan ssh tambahan .

  • instal netcatjika perlu
  • menggunakan termbin : cat ~/some_file.txt | nc termbin.com 9999. Ini akan menyalin output ke termbinsitus web dan mencetak URL ke output Anda.
  • kunjungi url itu dari komputer Anda, Anda mendapatkan output Anda

Tentu saja, jangan menggunakannya untuk konten sensitif.

maxbellec
sumber
Wow itu solusi yang sangat kreatif.
Sridhar Sarnobat
3

Jawaban ini berkembang pada jawaban yang dipilih dengan menambahkan lebih banyak keamanan.

Jawaban itu membahas bentuk umum

<command that makes output> | \
    ssh <user A>@<host A> <command that maps stdin to clipboard>

Di mana keamanan mungkin kurang dalam sshhak akses yang memungkinkan <user B>pada host B>ke sshdalam host Adan menjalankan setiap perintah.

Tentu saja Buntuk Amengakses mungkin sudah dilindungi oleh sshkunci, dan bahkan mungkin memiliki kata sandi. Tetapi lapisan keamanan lain dapat membatasi ruang lingkup perintah yang diizinkan yang Bdapat dijalankan A, misalnya sehingga rm -rf /tidak dapat dipanggil. (Ini sangat penting ketika sshkunci tidak memiliki kata sandi.)

Untungnya, sshmemiliki fitur bawaan yang disebut pembatasan perintah atau perintah paksa . Lihat ssh.com , atau pertanyaan serverfault.com ini .

Solusi di bawah ini menunjukkan solusi bentuk umum bersama dengan ssh pembatasan perintah yang diberlakukan.

Contoh Solusi dengan batasan perintah ditambahkan

Solusi keamanan yang ditingkatkan ini mengikuti formulir umum - panggilan dari sshsesi aktif host-Bhanya:

cat <file> | ssh <user-A>@<host A> to_clipboard

Sisanya menunjukkan pengaturan untuk membuatnya bekerja.

Pengaturan pembatasan perintah ssh

Misalkan akun pengguna di Byaitu user-B, dan B memiliki kunci ssh id-clip, yang telah dibuat dengan cara yang biasa ( ssh-keygen).

Lalu di user-Adirektori ssh ada file

/home/user-A/.ssh/authorized_keys

yang mengenali kunci id-clipdan memungkinkan sshkoneksi.

Biasanya isi dari setiap baris authorized_keyspersis kunci publik yang diotorisasi, misalnya isi id-clip.pub.

Namun, untuk menegakkan pembatasan perintah bahwa konten kunci publik diawali (pada baris yang sama) oleh perintah yang akan dieksekusi.
Dalam kasus kami:

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>

Perintah yang ditunjuk "/home/user-A/.ssh/allowed-commands.sh id-clip", dan hanya perintah yang ditunjuk, dieksekusi setiap kali kunci id-clipdigunakan memulai sshkoneksi ke host-A- tidak peduli apa perintah yang dituliskan sshbaris perintah .

Perintah menunjukkan file skrip allowed-commands.sh, dan konten file skrip itu

#/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

Panggilan asli ke sshmesin Badalah

... | ssh <user-A>@<host A> to_clipboard

String to-clipboarddilewatkan allowed-commands.sholeh variabel lingkungan SSH_ORIGINAL_COMMAND. Selain itu, kami telah memasukkan nama kunci id-clip, dari baris authorized_keysyang hanya dapat diakses oleh id-clip.

Garis

          notify-send "ssh to-clipboard, from ${Id}"

hanya kotak pesan popup untuk memberi tahu Anda bahwa clipboard sedang ditulis - itu mungkin fitur keamanan yang baik juga. ( notify-sendberfungsi di Ubuntu 18.04, mungkin bukan yang lain).

Dalam barisan

cat | xsel --display :0 -i -b

parameter --display :0ini diperlukan karena prosesnya tidak memiliki tampilan X sendiri dengan clipboard, sehingga harus dikhususkan secara eksplisit. Nilai ini :0berfungsi pada Ubuntu 18.04 dengan server Windows Wayland. Pada pengaturan lain mungkin tidak berfungsi. Untuk server X standar, jawaban ini mungkin membantu.

host-A /etc/ssh/sshd_config parameter

Akhirnya beberapa parameter di /etc/ssh/sshd_confighost Ayang harus diatur untuk memastikan izin untuk terhubung, dan izin untuk menggunakan ssh-kunci saja tanpa kata sandi:

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

Untuk membuat sshdserver membaca ulang konfigurasi

sudo systemctl restart sshd.service

atau

sudo service sshd.service restart

kesimpulan

Ini beberapa upaya untuk mengaturnya, tetapi fungsi-fungsi lain selain to-clipboarddapat dibangun secara paralel dengan kerangka kerja yang sama.

Craig Hicks
sumber
1
Xsel dengan remoteforwarding adalah satu-satunya jawaban yang bekerja untuk saya di Ubuntu 18.04 yang menjalankan i3 secara lokal. Tidak diperlukan penerusan X11.
Jay Stanley
2

Solusi paling sederhana dari semuanya, jika Anda menggunakan OS X menggunakan Terminal dan Anda telah ssh'ing di server jauh dan ingin mengambil hasil dari file teks atau log atau csv, cukup:

1) Cmd-Kuntuk menghapus output terminal

2) cat <filename>untuk menampilkan isi file

3) Cmd-Suntuk menyimpan Output Terminal

Anda akan secara manual menghapus baris pertama dan baris terakhir file, tetapi metode ini sedikit lebih sederhana daripada mengandalkan paket lain yang akan diinstal, "terowongan terbalik" dan mencoba memiliki IP statis, dll.

tw0000
sumber
+1 untuk teknik yang berguna yang saya gunakan sendiri, sedikit itu memaksa Anda untuk kehilangan riwayat terminal Anda dan (seperti yang disebutkan) masalah baris pertama / terakhir agak sedikit rumit.
Alan Storm
Setuju @AlanStorm
tw0000
Masalah yang lebih signifikan dengan pendekatan ini adalah hanya akan menyimpan jumlah baris yang dipertahankan oleh buffer terminal Anda. Seringkali itu bukan masalah tetapi jika Anda mencoba mengambil isi file log maka Anda mungkin kehabisan kapasitas,
Sridhar Sarnobat
Itu benar @ Sridhar-Sarnobat, itu bukan solusi yang sangat baik secara umum. Saya hanya menggunakan scp!
tw0000