ara ana bilgisayar üzerinden scp dosyaları


85

3, A, B ve C makinelerine erişime sahibim. Tek olası (ssh) bağlantıları:

A -> B
B <-> C

A'dan C'ye dosya almam gerekiyor, bu yüzden A'dan B'ye dosyaları ve sonra da B'den C'yi bulabilirim. Ancak, B'nin fazla disk alanı yok, bu yüzden bu bir seçenek değil. Dosyaları A'dan C'ye B yoluyla scp yapmanın bir yolu var mı? Unutmayın, hiçbir makineye kök erişimim yok, bu yüzden herhangi bir kalıcı tünel kurabileceğimi sanmıyorum, ancak hatalıysam beni düzeltin!


6
Bunun soruyu cevaplamadığını biliyorum, ancak rsync'i bilmeyenler veya bunu bir ev sahibi aracılığıyla atlamak için nasıl kullanacaklarını bilmeyenler için bu yararlı bir ipucu olabilir: '-e' seçeneğini kullanın böyle rsync ile:A$ rsync <options> -e 'ssh B ssh' source C:destination
Eddified

Yanıtlar:


108

ProxyJump

OpenSSH 7.3’deki Yeni:

A$ scp -oProxyJump=B thefile C:destination

(Perdenin arkasında, bu sadece ProxyCommand ve kullanır ssh -W.)

ProxyCommand

Diğer cevaplardan -W içerecek şekilde güncellendi:

A$ scp -oProxyCommand="ssh -W %h:%p B" thefile C:destination

A yüklü bir SSH istemcisine sahipse (desteksiz -W) veya B, TCP iletime izin vermeyecek şekilde yapılandırılmışsa (ancak yine de kabuk komutlarına izin verir), alternatifleri kullanın:

A$ scp -oProxyCommand="ssh B socat stdio tcp:%h:%p" thefile C:destination
A$ scp -oProxyCommand="ssh B nc %h %p" thefile C:destination

borular

A$ tar cf - thefile anotherfile | ssh B "ssh C \"cd destination && tar xvf -\""
A$ (echo thefile; echo anotherfile) | cpio -o | ssh B "ssh C \"cd destination && cpio -i\""

Sadece bir dosya için:

A$ ssh B "ssh C \"cd destination && cat > thefile\"" < thefile

B'den "Tünel"

A$ ssh -f -N -L 4567:C:22 B
(continues running in background)

A$ scp -P 4567 thefile localhost:destinationPath

İşiniz bittiğinde, önceden başlatılan sshişlemi (bu nedenle nedeniyle arka plana düşmüş) öldürmeyi unutmayın -f -N.

  • -fSsh'nin komut çalıştırmadan hemen önce arka plana gitmesini ister. Bu, ssh şifre veya şifre cümleleri isteyecekse faydalıdır, ancak kullanıcı arka planda ister. Bu -n anlamına gelir.
  • -NUzak bir komut çalıştırma. Bu sadece portları yönlendirmek için kullanışlıdır.

B'den A'ya "tünel" yi ters çevirin

Her zaman olsa işe yaramazsa:

A$ ssh -f -N -R 4567:localhost:22 B
(now you can reach A from B, by using localhost:4567)

B$ scp -P 4567 localhost:thefile C:destination
  • -R Uzak (sunucu) ana bilgisayarda verilen TCP portuna veya Unix soketine bağlantıların, yerel sunucuda verilen ana bilgisayara ve bağlantı noktasına veya Unix soketine iletileceğini belirtir.

Bu örnekler @grawity için çok teşekkürler. Bir soru - tar c thefile başka bir dosyayı ters çevirmek mümkün mü | ssh B "ssh C \" cd hedefi && tar xv \ ""
´den

@dmeu: Evet, mümkün.
grawity

MacOS kullandığımı söylersem daha önce başlatılmış olan ssh işlemini nasıl öldürürüm?
Aero Windwalker,

Not: Her zamanki gibi, eğer istersen scp dan C, gerçi B, için A, yapabileceğin A$ scp -oProxyJump=B C:destination thefile.
jvriesem

@Pablo Daha iyi kullan -S, sonra, ve -O çık. Veya ... en azından pkill -f.
Grawity

24

Scp 2011'in başlarından ve sonrasındaki sürümlerinde "-3" seçeneği bulunabilir:

 -3      Copies between two remote hosts are transferred through the local
         host.  Without this option the data is copied directly between
         the two remote hosts.  Note that this option disables the
         progress meter.

Bu varsa, sadece koşabilirsiniz:

B$ scp -3 A:file C:file

Benim durumumda ana bilgisayar A'ya sadece B'den (VPN'li) erişilebildi. Ana C, B ile aynı LAN'daydı. A'dan C'ye bir dosya almak istedim ve scp-3 zekice çözüldü.
Joe,

Her iki ana bilgisayar da şifre istediğinde bu konuda sorun yaşadım. Her ikisini de aynı anda ister (aynı satırda iki şifre istemi göründü) ve sonra şifremi kabul etmedi. Sonunda parolamı tekrar tekrar yazarak (her iki ana bilgisayarda da aynı parola) yazarak çalışmaya başlayabilirdim, ancak bunu anlamak zordu.
Colin D

8

Neredeyse tüm zaten benim son kuruşuna burada belirtmekle birlikte edilmiştir: Ben olmadan ProxyCommand varyasyonu kullanacak ncne de soc. OpenSSH Proxies ve Jumphost Cookbook'a dayanarak Aşağıdaki konfigürasyonu hazırladım:

  1. Bu yüzden şu oyunculara sahibiz:

    • HOME_HOST: Bir dosyayı hedef ana bilgisayara kopyaladığımız yer
    • HOP_HOST: Biz kopya yoluyla (HOP_USER olarak kaydedilir) bu ana
    • TARGET_HOST: bu bizim hedefimiz (TARGET_USER olarak doğrulandı)
  2. Önce benim ev ana bilgisayardan benim yerel ortak anahtarı eklendi .ssh/id_dsa.pub için .ssh/authorized_keyshem hop ve hedef hosts. Evet, ev sahibinden her ikisine aynı ortak anahtar. Genelde HEDEF anahtarına eklemek zorunda olduğunuz HOP açık anahtarı olmasını beklersiniz.

  3. Sonra .ssh/configaşağıdaki girişi ekleyerek biraz tweaked :

    Host TARGET_HOST
       User TARGET_USER
       ProxyCommand ssh -W %h:%p HOP_USER@HOP_HOST
    
  4. Bundan sonra kopyalama işlemi: basittir scp FILE TARGET_HOST:. Hem atlama hem de hedef düğümlerden çift pankartlar gösterir, ancak çalışır.

Tabii ki doğrudan hedefe ssha yukarıdaki kullanabilir: ssh TARGET_HOST. Scp ve ssh ile çalışır.

Daha genel bir seçenek, bir çeşit şeffaf vekil (sp üzerinden vpn) gibi görünen sshuttle yardımcı programı olabilir . Bu nedenle, A-> B <-> C durumunda, C'nin ağındaki her düğüme bağlanmaya izin verir: A-> B- [CDEFG]. Yönetici gerektirmez ancak Python 2.7 (3.5 de Tamam) gerektirir, ki her zaman sahip olduğumuz şey değildir. Denemeye değer.


7
ssh -L 4321:hostC:22 youruser@hostB

başka bir kabukta:

scp -P 4321 localfile youruser@127.0.0.1

Bu port yönlendirme kullanıyor. Buradaki tek sınırlama ana bilgisayar B'nin bağlantı noktası iletmeye izin verecek şekilde yapılandırılması gerekir. Aksi takdirde bu iyi çalışması gerekir.

Açıklayıcı olarak, içinde -Lve -Rbağlantı noktalarını iletmek için izin verir. İçinde -Lverilen ilk port, ssh portu kaynak makineyi dinlemeye başlayacaktır (A sunucusu) ve bu porttan aldığı herhangi bir şeyi SSH bağlantınız üzerinden B hostuna iletecek ve daha sonra 22 numaralı portta C sunucusuna yönlendirecektir.

Düzenle

Sözdizimini biraz karıştırdım. LOCAL makinenizde bir ileriye doğru ayarlar.


@astrofrog - Cevaplarımızdan biri ihtiyaçlarınızı karşılıyorsa, muhtemelen bunlardan birini kabul etmelisiniz.
Brian Vandenberg

2

Grawity'nin ProxyCommand cevabı benim için işe yaradı, ancak SSH'ye daha az aşina olduğum için biraz deneme aldı. Kendim gibi SSH'ye yeni başlayan herhangi bir yeniliğe yardımcı olmak için Grawity'nin cevabını daha fazla ayrıntı ile araştıracağımı düşündüm. Daha açık gösterim için tanımlar:

Makine A: üzerinde bulunduğunuz makine

Sunucu B: userB@ip.address.for.B (atlama sunucusu veya orta sunucu)

Sunucu C: userC@ip.address.for.C (kopyalamak istediğiniz uzak sunucu)

ProxyCommnad

    A$ scp -oProxyCommand="ssh -W %h:%p userB@ip.address.for.B" thefile userC@ip.address.for.C:destination

Beton Örneği

Bu nedenle somut bir örnek için, (Server C) 0.0.1.2adlı bir kullanıcı hesabı olan IP'li bir sunucuya erişiminiz olduğunu söyleyin bar. Ancak, bunu elde etmek için önce 0.0.1.1kullanıcı hesabı foo(Sunucu B) olan IP'li bir sunucuya giriş yapmanız gerekir . Şimdi dosyayı kopyalamak istediğiniz baz.txtsunucu için geçerli makine (Makine A) üzerinde bulunan 0.0.1.2'ın /home/bar/dizininde. Bu örnek için yukarıdaki ProxyCommand'ı kullanmak için , aşağıdakileri uygularsınız :

    A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" baz.txt bar@0.0.1.2:/home/bar/

Dosyanın ve hedefin sırasını değiştirerek bir dosyayı Sunucu C'den kolayca kopyalayabilirsiniz. Yani, örneğin, eğer baz.txtsunucu üzerinde zaten 0.0.1.2bulunan /home/bar/o zaman kullanarak makinenize kopyalamak olabilir:

    A$ scp -oProxyCommand="ssh -W %h:%p foo@0.0.1.1" bar@0.0.1.2:/home/bar/baz.txt /destination/path/on/A

Umarım bu, başkalarına göre biraz daha fazla şey ifade eden şeylere ihtiyaç duyan insanlara yardımcı olur.

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.