Uzak bir SSH oturumundan yerel panoya veri gönderme


161

Borderline ServerFault sorusu, ancak bazı kabuk komut dosyaları programlıyorum , bu yüzden önce burada deniyorum :)

* Nix'lerin çoğunda, çıktıyı yerel panoya / çalışma tahtasına yönlendirmenizi / yönlendirmenizi ve aynı yerden almanızı sağlayan bir komut vardır. OS X'te bu komutlar

pbcopy, pbpaste 

SSHed başka bir sunucuda iken bu işlevselliği çoğaltmak için yine de var mı? Yani,

  1. A bilgisayarını kullanıyorum.
  2. Bir terminal penceresi açıyorum
  3. I SSH - Bilgisayar B
  4. B Bilgisayarında bir komut çalıştırıyorum
  5. B Bilgisayarının çıkışı yeniden yönlendirilir veya otomatik olarak Bilgisayar A panosuna kopyalanır.

Ve evet, komuttan metni seçmek için faremi (shudder) kullanabileceğimi biliyorum, ancak uzak oturumlarım için aynısını istediğim doğrudan panoya çıkış pipping iş akışına çok alıştım.

Kod faydalıdır, ancak genel yaklaşımlar da takdir edilmektedir.

Yanıtlar:


89

Ben bu konu diriliyorum çünkü aynı tür bir çözüm arıyordum ve benim için çalışan bir tane buldum. OSX Daily'den bir öneri için küçük bir değişiklik .

Benim durumumda, bir linux sunucusuna SSH aracılığıyla bağlanmak için yerel OSX makinemdeki Terminal'i kullanıyorum. OP gibi, sadece klavyeyi kullanarak küçük metin parçalarını terminalden yerel panomuza aktarabilmek istedim.

Çözümün özü:

commandThatMakesOutput | ssh desktop pbcopy

Bir ssh oturumunda uzak bir bilgisayara çalıştırıldığında, bu komut commandThatMakesOutput (örneğin, ls, pwd) çıktısını alır ve çıktıyı yerel bilgisayarın panosuna bağlar ("masaüstü" adı veya IP'si). Başka bir deyişle, iç içe ssh kullanır: uzak bilgisayara bir ssh oturumu aracılığıyla bağlısınız, oradaki komutu yürütürsünüz ve uzak bilgisayar masaüstünüze farklı bir ssh oturumu aracılığıyla bağlanır ve metni panonuza koyar.

Masaüstünüzün bir ssh sunucusu olarak yapılandırılmasını gerektirir (size ve google'a bırakıyorum). Tercihen oturum başına parola kullanarak veya güvenlik gereksinimleriniz ne olursa olsun, hızlı ssh kullanımını kolaylaştırmak için ssh anahtarları ayarladıysanız çok daha kolaydır.

Diğer örnekler:

ls  | ssh desktopIpAddress pbcopy
pwd |  ssh desktopIpAddress pbcopy

Kolaylık sağlamak için, borudan sonra gereken metni kısaltmak için bir bash dosyası oluşturdum:

#!/bin/bash
ssh desktop pbcopy

Benim durumumda, özel olarak adlandırılmış bir anahtar kullanıyorum

Ben cb (my mnemonic (ClipBoard) dosya adıyla kaydetti . Komut dosyasını yolunuza bir yere koyun, çalıştırılabilir ve voila olun:

ls | cb

3
Ben vim bunu sık sık. Bunu yapmak için, görsel modda neyi kopyalamak istediğinizi seçin, sonra şunu yazın::'<,'>w !ssh desktop pbcopy
Mike Brennan

@MikeBrennan Metni seçtiğinizde, neden sadece cmd + C tuşlarına (veya ayarladığınız kopya anahtarına) basmıyorsunuz? ...
Petr Peller

36
Bunun gibi, sadece masaüstünüzün statik bir IP'si varsa ve ssh'd kutunuzdan erişilebilir olduğunda gerçekten çalışır. Bu benim için asla geçerli değil.
kqw

6
Bunun tersi daha kolay olmaz mıydı? ssh user @ remote 'commandThatMakesOutput' | pbcopy
rulio

-e noneBurada açıklanan ssh bayrağına ihtiyacım vardı: unix.stackexchange.com/questions/210615/…
Pat Myron

122

En sevdiğim yol ssh [remote-machine] "cat log.txt" | xclip -selection c. Bu, ssh'ı uzaktan kumandadan lokale istemediğinizde (veya yapamadığınızda) yararlıdır.

Düzenleme: Cygwin'de ssh [remote-machine] "cat log.txt" > /dev/clipboard.

Düzenleme: nbren12 yararlı bir yorum:

SSH bağlantı noktası iletmeyi kullanarak ters ssh bağlantısı kurmak neredeyse her zaman mümkündür. RemoteForward 127.0.0.1:2222 127.0.0.1:22Yerel olarak sunucunuzun girişine eklemeniz .ssh/configve ardından ssh -p 2222 127.0.0.1uzak makinede yürütmeniz gerekir ; bu bağlantıyı yerel makineye yönlendirir. - nbren12


6
+1: Ters SSH bağlantısı mümkün olmadığında diğer çözümlerden çok daha kolay!
John Dibling

9
Bu son derece basit çözüm için daha fazla beğeni hak ediyorsunuz!
Kamil Dziedzic

31
Mac OSX'te olanlar için,ssh [remote-machine] "cat log.txt" | pbcopy
chowey

1
Bu rapora göre burada , ben kullanmak zorunda catWindows 8 cygwin çalışma için bu almak için: ssh [remote-machine] "cat log.txt" | cat > /dev/clipboard(tabii ki benim uzaktan komut değildi cat; o bir serseri sanal makine içinde başka bir şeydi bu yüzden aslında koştu vagrant ssh -c "command" | cat > /dev/clipboard)
Tiby

7
Öyle hemen hemen kurulum için her zaman SSH port yönlendirmesi kullanarak bir ters ssh bağlantısı mümkün. RemoteForward 127.0.0.1:2222 127.0.0.1:22Yerel bölgenizdeki sunucular girişine ekleyin .ssh/configve ardından ssh -p 2222 127.0.0.1uzak makinede yürütün ; bu bağlantıyı yerel makineye yönlendirecektir.
nbren12

30

Ters ssh bağlantısı gerektirmeyen harika bir çözüm bulundu!

OSX sisteminde ssh X11 iletme ve XQuartz ile birlikte uzak ana bilgisayarda xclip kullanabilirsiniz.

Bunu ayarlamak için:

  1. XQuartz'ı yükleyin (bunu solist + pivotal_workstation :: xquartz tarifi ile yaptım , ancak zorunda değilsiniz)
  2. XQuartz.app dosyasını çalıştırın
  3. XQuartz Tercihlerini Aç ( kb_command+ ,)
  4. "Senkronizasyonu Etkinleştir" ve "CLIPBOARD değiştiğinde Çalışma Alanını Güncelle" seçeneğinin işaretli olduğundan emin olunXQuartz Tercihleri ​​penceresi örneği
  5. ssh -X remote-host "echo 'hello from remote-host' | xclip -selection clipboard"

1
Bunun farkı ssh remote-host "echo 'hello from remote-host' | pbcopynedir? Böyle bir şey işe yarayacaksa bu mükemmel bir cevap olacaktır: ssh -X remote-hosto zaman uzak ana bilgisayarda:echo 'hello from remote-host' | xclip -selection clipboard
kqw

5
@KasperSouren. Umarım nasıl umduğun işe yarıyor. `| xclip` çift tırnak içine alınır.
gdw2

1
2016 yılında, bu açıkça en iyi, fırfırsız çözüm. Diğer, ters-ssh tabanlı çözümleri unutun.
shivams

1
Bunu bir kerelik bir komut olmadan yapmanın bir yolu var mı? Uzak sunucuma ssh üzerinden etkileşimli bir oturumda oturum açmak ve sonra yerel panoya keyfi olarak gönderebilmek istiyorum. Bu ters ssh gerektirir mi?
Kvass

2
@Kvass: -XX11 SSH üzerinden yönlendirme için kullandığınız sürece , X11 programları yukarıdaki XQuartz ayarları aracılığıyla panonuzu güncelleyebilir. Bir kerelik komut, üzerinden echouzak ana bilgisayarın panosuna bir şey göndermenin xclipişe yaradığını ve yerel SSH istemci ana makinenizle senkronize edilmesi gerektiğini göstermektir. @ Gdw2'nin dediği gibi " | xclipÇift tırnak içinde". Bu nedenle, uzak sunucuda panosuna bir şey göndermek için bir komut olarak yürütülür.
TrinitronX

18

Ssh sunucusunda ters tünel bağlantı noktası

Mevcut tüm çözümlerin şunlara ihtiyacı vardır:

  • X11 istemcide (varsa xclip, sunucuda harika çalışıyor) veya
  • istemci ve sunucunun aynı ağda olması (evdeki bilgisayarınıza erişmeye çalışıyorsanız durum böyle değildir).

İşte bunu yapmanın başka bir yolu olsa da, bilgisayarınıza nasıl ssh yaptığınızı değiştirmeniz gerekir.

Bunu kullanmaya başladım ve göründüğü kadar korkutucu bir yer yok, bu yüzden bir deneyin.

İstemci (ssh oturumu başlatma)

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

(ipucu: bunu bir anahtar bağlayıcı yapın, böylece yazmak zorunda kalmazsınız)

İstemci (başka bir sekme)

nc -l 2000 | pbcopy

Not: yoksa, pbcopysadece teebir dosyaya.

Sunucu (SSH oturumunun içinde)

cat some_useful_content.txt | nc localhost 2000

Diğer notlar

Aslında bir ssh oturumunun ortasında olsanız bile bir tünele başlamanın bir yolu var ama insanları göründüğü kadar kötü olmayan şeylerden korkutmak istemiyorum. Ama eğer ilgi görürsem ayrıntıları daha sonra ekleyeceğim


1
+1 - bu oldukça temiz. Ancak - cat some_useful_content.txt | nc localhost 2000bunu yaptığımda komut askıda gibi görünüyor. Bunu durdurmak için manuel olarak ctr-c'ye ihtiyacım var ve ancak o zaman içerik müşteri klibime /
Alan Storm

1
Birisi diğer uçtaki verileri kaldırıncaya kadar bekleyecektir.
Sridhar Sarnobat

Aslında sorunuzu yanlış anladığımı düşünüyorum. Bunun neden olduğundan emin değilim.
Sridhar Sarnobat

nc -l -pbenim için çalışıyor, ama nc -lçalışmıyor. Ayrıca @AlanStorm sorunum var.
HappyFace

1
Netcat'i asma problemini belirterek çözdüm -c. Demlemek için kurulan GNU netcat kullanıyorum.
HappyFace

7

Dahil erişim X11 seçimleri, çeşitli araçlar vardır xclip ve XSel . X11'in geleneksel olarak birden çok seçimi olduğunu ve çoğu programın hem pano hem de birincil seçimi (aynı olmadığını) anladığını unutmayın. Emacs ikincil seçim ile de çalışabilir, ancak bu nadirdir ve kimse kesilmiş tamponlarla ne yapacağını bilmiyor ...

$ xclip -help
Kullanımı: xclip [SEÇENEK] [DOSYA] ...
Okuma veya yazma için bir X sunucusu seçimine erişin.

  -i, -in standart giriş veya dosyalardan X seçimine metin okuma
                   (varsayılan)
  -o, -out seçimi standart çıkışa yazdırır (genellikle
                   bir dosya veya programa aktarma)
  -l, -Çıkmadan önce beklenecek seçim isteği sayısını döngüler
  bağlanmak için -d, -display X ekranı (ör. localhost: 0 ")
  -h, -yardım kullanım bilgileri
      seçim için seçim seçimi ("birincil", "ikincil", "pano" veya "arabellek kesme")
      -noutf8 metni utf-8 olarak ele alma, eski unicode kullanma
      sürümü sürüm bilgisi
      -sadece sessiz hatalar, arka planda çalıştır (varsayılan)
      - sessiz ön planda koş, neler olduğunu göster
      - ayrıntılı çalışma yorumu

Hataları <astrand@lysator.liu.se> olarak bildirin
$ xsel -help
Kullanım: xsel [seçenekler]
X seçimini değiştirin.

Varsayılan olarak, geçerli seçim verilir ve her ikisi de
standart giriş ve standart çıkış terminallerdir (tty). Aksi takdirde,
standart çıkış terminal değilse akım seçimi verilir
(tty) ve standart giriş varsa seçim standart girişten ayarlanır
bir terminal (tty) değil. Herhangi bir giriş veya çıkış seçeneği belirtilmişse
program yalnızca istenen modda çalışır.

Hem giriş hem de çıkış gerekiyorsa, önceki seçim
standart girdinin içeriği ile değiştirilmeden önce çıkış.

Giriş seçenekleri
  -a, --ek ekle Seçime standart girdi ekle
  -f, --follow Standart girdi büyüdükçe seçime ekle
  -i, --input Seçime standart girişi oku

Çıktı seçenekleri
  -o, --output Seçimi standart çıktıya yaz

İşlem seçenekleri
  -c, --clear Seçimi temizle
  -d, --delete Seçimin temizlenmesini ve
                        sahip olduğu uygulama içeriğini siler

Seçim seçenekleri
  -p, --primary PRIMARY seçiminde çalıştır (varsayılan)
  -s, - İkincil SECONDARY seçiminde çalıştır
  -b, --clipboard CLIPBOARD seçiminde çalıştır

  -k, --keep Seçimleri değiştirmeyin, ancak PRIMARY yapın
                        ve SECONDARY seçimleri,
                        çıkışta seçildikleri programlar.
  -x, --exchange PRIMARY ve SECONDARY seçimlerini değiştirin

X seçenekleri
  --görünüm adı
                        X sunucusuyla bağlantıyı belirtin
  -t ms, --selectionTimeout ms
                        Zaman aşımını milisaniye cinsinden belirtiniz.
                        seçim alınmalıdır. 0 (sıfır) değeri
                        zaman aşımı olmadığını belirtir (varsayılan)

Çeşitli Seçenekler
  -l, --logfile Ayrıldığında hataları günlüğe kaydedecek dosyayı belirtir.
  -n, --nodetach Kontrol terminalinden ayırmayın. olmadan
                        bu seçenek, xsel bir arka plan olmak için çatal olacak
                        giriş, değişim ve saklama modlarında süreç.

  -h, --help Bu yardımı görüntüle ve çık
  -v, --verbose Bilgilendirici mesajları yazdır
  - sürüm Çıktı sürümü bilgileri ve çıkış

Lütfen hataları <conrad@vergenet.net> adresine bildirin.

Kısacası, ne istediğinize bağlı olarak xclip -i/ xclip -oveya xclip -i -sel clip/ xclip -o -sel clipveya xsel -i/ xsel -oveya xsel -i -b/ öğesini denemelisiniz xsel -o -b.


4
@Ephemient için 'ın yazı eklemek için: amacıyla kullanılması xclip & xsel bir uzak ana ile, bunu gibi X11 Yönlendirme kullanabilirsiniz: ssh -C -X user@remote-host. Uzak tarafta xclip çalıştırmak çalışmıyor gibi görünüyorsa X11Forwarding yes, uzak /etc/ssh/sshd_configdosyada ayarlandığından emin olun . Ayrıca xauthuzak tarafa takıldığından emin olun . Başsız bir makine için xauthve yükleyebilirsiniz xvfb.
TrinitronX

Ekstra ayrıntılar ve vim anahtar bağlantıları içeren bir açıklama .
Tim Bunce

1
@TrinitronX oh vay - kafamı bir duvara vurarak, xvfbbahsettiğin için teşekkürler . Başsız bir sunucu çalıştırıyordum, bu yüzden X11 çalışıyor olmamalı!
Cam

5

Bu benim çözümüm SSH ters tünel, netcat ve xclip tabanlı.

Önce iş istasyonunuzda komut dosyası (örn. Clipboard-daemon.sh) oluşturun:

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

ve arka planda başlatın.

./clipboard-daemon.sh&

Verilerin bir kısmını aldıktan sonra nc boru çıkışını xclip ve yeniden doğma işlemine başlatacaktır.

Ardından uzak ana bilgisayara ssh bağlantısını başlatın:

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

Uzak kutuda oturumunuz açıkken şunu deneyin:

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

sonra iş istasyonunuza yapıştırmayı deneyin

Tabii ki clipboard-daemon.sh ve ardından ssh oturumunu başlatan sarıcı komut dosyası yazabilirsiniz. Benim için böyle çalışır. Zevk almak.


Bu çözüm benim için en uygun çözümdür. çok karmaşık değildir ve düzgün çalışır.
Marcel Valdez Orozco

Bence en iyi çözüm. Güvenlik sonuçları olan ters ssh bağlantısına izin verme konusunda endişelenmenize gerek yok ve sonsuz döngü hoş bir dokunuş.
R.Taukulis

4

Tek astar değil , ekstra ssh gerektirmez .

  • netcatgerekirse yükle
  • kullanmak termbin : cat ~/some_file.txt | nc termbin.com 9999. Bu, çıktıyı termbinweb sitesine kopyalar ve URL'yi çıktınıza yazdırır.
  • bu url'yi bilgisayarınızdan ziyaret ederseniz, çıktılarınızı alırsınız

Tabii ki, hassas içerik için kullanmayın.


Vay canına, bu çok yaratıcı bir çözüm.
Sridhar Sarnobat

3

Bu cevap, daha fazla güvenlik ekleyerek hem seçilen cevap üzerine gelişir .

Bu cevap genel formu tartıştı

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

Nerede güvenlik yoksun olabilir içindedir sshizinleri izin <user B>üzerine host B>kadar sshiçine host Ave yürütmek herhangi komutu.

Tabii Biçin Aerişim zaten tarafından kapılı edilebilir sshanahtarın ve hatta bir şifreye sahip olabilir. Ancak başka bir güvenlik katmanı, Bçalıştırılabilen izin verilebilir komutların kapsamını kısıtlayabilir A, örneğin rm -rf /çağrılamaz. (Bu, özellikle sshanahtarın bir parolası yoksa önemlidir .)

Neyse ki, komut kısıtlaması veya zorunlu komutssh adı verilen yerleşik bir özellik var . Bkz. Ssh.com veya bu serverfault.com sorusu .

Aşağıdaki çözüm, uygulanan ssh komut kısıtlamasıyla birlikte genel form çözümünü göstermektedir .

Komut kısıtlaması eklenmiş örnek çözüm

Bu güvenliği artırılmış çözüm genel formu izler - sshoturumdaki çağrı host-Bbasitçe:

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

Bunun geri kalanı bunu işe yarayacak düzeneği gösterir.

Kur ssh komutu kısıtlaması

Kullanıcı hesabının açık Bolduğunu user-Bve B'nin id-clipher zamanki gibi oluşturulmuş bir ssh anahtarı olduğunu varsayalım ( ssh-keygen).

Sonra user-Assh dizininde bir dosya var

/home/user-A/.ssh/authorized_keys

anahtarı id-cliptanır ve sshbağlantıya izin verir .

Genellikle her satırın içeriği authorized_keystam olarak yetkilendirilen ortak anahtardır, örneğin id-clip.pub.

Ancak, ortak anahtar içeriğinin yürütülecek komutla (aynı satırda) önüne getirildiği komut kısıtlamasını uygulamak .
Bizim durumumuzda:

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>

Komuta etmek üzere dizayn "/home/user-A/.ssh/allowed-commands.sh id-clip"ve sadece anahtar her komutu belirlenen ki yürütüldüğünde id-clipkullanılan bir başlatmak sshiçin bağlantıyı host-A- yazılanları komutu olursa olsun sshkomut satırı .

Komut bir komut dosyasını belirtir allowed-commands.shve bu komut dosyasının içeriği

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

Orijinal çağrı sshmakinede Boldu

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

Dize to-clipboard, allowed-commands.shortam değişkeni tarafından iletilir SSH_ORIGINAL_COMMAND. Ek olarak, yalnızca erişildiği id-clipsatırdan anahtarın adını geçtik .authorized_keysid-clip

Çizgi

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

panonun yazıldığını bildiren bir açılır mesaj kutusu - bu muhtemelen iyi bir güvenlik özelliği. ( notify-sendUbuntu 18.04 üzerinde çalışır, belki diğerleri değil).

Çizgide

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

parametre --display :0, işlemin pano ile kendi X ekranına sahip olmaması nedeniyle gereklidir, bu nedenle açıkça belirtilmelidir. Bu değer :0Wayland pencere sunucusu ile Ubuntu 18.04 üzerinde çalışır. Diğer kurulumlarda çalışmayabilir. Standart bir X sunucusu için bu cevap yardımcı olabilir.

host-A /etc/ssh/sshd_config parametreler

Son olarak /etc/ssh/sshd_config, ana bilgisayarda A, bağlanma iznini sağlamak için ayarlanması gereken birkaç parametre ve ssh-key komutunu yalnızca parola olmadan kullanma izni :

PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A

Yapmak için sshdsunucu yapılandırma yeniden okumak

sudo systemctl restart sshd.service

veya

sudo service sshd.service restart

Sonuç

Kurmak biraz çaba gerektiriyor, ancak diğer işlevler to-clipboardaynı çerçeveye paralel olarak inşa edilebilir.


1
Uzaktan yönlendirme ile Xsel, yerel olarak i3 çalıştıran Ubuntu 18.04'te benim için çalışan tek cevaptı. X11 iletimi gerekmez.
Jay Stanley


2

En basit çözüm, Terminal'i kullanarak OS X kullanıyorsanız ve uzak bir sunucuda dolaşıyorsanız ve bir metin dosyasının veya günlüğün veya csv'nin sonuçlarını almak istiyorsanız, basitçe:

1) Cmd-Kterminalin çıkışını temizlemek için

2) cat <filename>dosyanın içeriğini görüntülemek

3) Cmd-STerminal Çıkışını kaydetmek için

Dosyanın ilk satırını ve son satırını el ile kaldıracaksınız, ancak bu yöntem, yüklenecek diğer paketlere, "ters tünellere" ve statik bir IP'ye sahip olmaya çalışmaktan biraz daha basit.


Kendimi kullandığım kullanışlı bir teknik için +1, terminal geçmişinizi kaybetmenize neden oluyor ve (belirtildiği gibi) ilk / son satır problemi biraz tuhaf.
Alan Storm

Kabul edildi @AlanStorm
tw0000

Bu yaklaşımla ilgili en önemli sorun, yalnızca terminal tamponunuzun tuttuğu satır sayısını kaydetmesidir. Genellikle bu bir sorun değil, ancak bir günlük dosyasının içeriğini kapmaya çalışıyorsanız, kapasite
yetersiz

Bu doğru @ Sridhar-Sarnobat, genel olarak çok iyi bir çözüm değil. Sadece kullanıyorum scp!
tw0000
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.