Soru Multihop SCP transferlerini nasıl yaparım?


Bir dosyamı A makinemden C sunucusuna kopyalamak istiyorum, ancak yalnızca sunucu C üzerinden sunucu C'ye erişimim var.

İlk önce sunucu B'ye aktarılmak yerine, giriş yapın ve daha sonra sunucu C'ye aktarın, dosyayı doğrudan SCP veya benzeri programlarla aktarmak mümkün mü?

(Emacs tramp-mode, dosyaları uzaktan düzenlemek için bu özelliğe sahiptir).


76
2017-07-08 12:09


Menşei




Cevaplar:


OpenSSH'i varsayarak, SSH yapılandırmanıza .ssh / config dizinine ekleyin.

Host distant
ProxyCommand ssh near nc distant 22

Bu, SSH'nin, yakın adlı makineden uzak bir şekilde adlandırılan makineye "doğrudan" bağlanmasına neden olacaktır. Daha sonra uzak makineye scp ve sftp gibi uygulamaları kullanabilir.

Bunun işe yaraması için 'nc' aka netcat adlı makineye yakın adında ihtiyacınız var. Ama çok fazla modern sistem zaten var.

Tar'ın sözdizimi ve çalışma kurallarını ezberlediğiniz varsayılarak, tow'un katran çözümü tek adımlı problemler için daha etkilidir.


43
2017-07-08 12:25



Bu benim kullandığım aynı yöntem ... Bu örnekte 'uzak' sunucu C olurdu ve 'yakın' açıklama için sunucu B olurdu ... - Jeremy Bouse
Pek çok modern makinede 'nc' yok: normalde sadece Linux makinelerinde ve sadece istek üzerine (standart kurulumun bir parçası değil) kullanılabilir. - Mei
ssh şimdi -W seçeneğine sahip, bunu 'nc' olmadan otomatik olarak yapıyor, ama neden scp -W'nin olmadığını merak ediyorum - kubanczyk
Şu durumda tek kişi olmamam durumunda: Eğer kullanıcı adı açıksa near kullanıcı adından farklı distant, yakın kullanıcı girer ProxyCommand ssh nearuser@near...ve uzak kullanıcı ayrı bir yere gider User distantuser hat. - Mu Mind
Sadece ssh multi hope yazın ve Google'a basın Kendimi şanslı hissediyorum - chandank


Ekleyebilirsin -o seçenekleri scp yerine .ssh/config.

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_host Bu durumda "sunucu B" dir.


41
2018-01-11 17:30



Ve bunu yapmak için tercih ettiğim yol. Aynı ana bilgisayara bir ağ geçidinden ve doğrudan erişirseniz, çoklu konumlandırma için .ssh / config en iyi çözüm değildir. - GabrieleV
Bu, farklı / özel kullanıcı adları ve bağlantı noktaları ile nasıl olurdu? - Pablo Bianchi


(B) makineye yakın sunucudaki ssh'in daha yeni sürümleriyle aşağıdakiler netcat olmadan çalışacaktır:

Host distant
    ProxyCommand ssh near -W distant:22

Ancak, AllowTcpForwarding'in yakın (B) makinede yes (varsayılan) olmasını gerektirir.

düzenleme: B'de OpenSSH 5.4+ gerektirir


19
2018-03-20 01:04



ÇALIŞIYOR bir cazibe gibi :) - gongzhitaao
Ve en azından OpenSSH 7.4p1 itibariyle, bir "ProxyJump" komutu vardır, burada sadece her kullanıcı @ host: portunu virgülle ayırmak zorundadır. Güzel! - hmijail
ProxyJump güzel, ancak User ve IdentityFile dosyasını config dosyasından almadı. ProxyCommand -W bunu yapar ve ayrıca scp ile çalışır. - rickfoosusa


Gibi bir şey kullanarak sunucu B'ye ssh

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

Sonra C kullanarak sunucuya ssh yapabilirsiniz

ssh -p 5022 <user_serverC>@localhost 

Benzer şekilde scp kullanarak çalışır

scp -P 5022 foo.txt <user_serverc>@localhost:

Sc ve ssh ile doğru p harfini kullanmayı unutmayın.


15
2017-07-08 13:02





Gerçekten kötülük yapmak istiyorsan, ssh ve katranı zincirleyebilirsin. tar c mydir | ssh server "ssh otherserver | tar x"ama bu problemlerin tüm ellerine geçebilir.

Daha kolay yol, sadece SSH yerleşik yöntemleri ile bir SSH tüneli kurmak olurdu; bak -D manpage'i açın ve biraz bağlantı noktasını diğer sunucunun ssh portuna yönlendirin.


3
2017-07-08 12:16





Kimlik doğrulaması için sertifikaları kullanmanız gerektiğinde (AWS ortamlarında tipik olarak) bile mümkün ve nispeten kolaydır.

Aşağıdaki komut dosyaları remotePath üzerinde server2 doğrudan makinenize localPath. Dahili olarak scp isteği üzerinden proxy edilir. server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Etrafında başka bir yol da (yükleme dosyası) çalışır:

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

Bunun yerine şifre kimlik doğrulaması kullanıyorsanız, şunu deneyin.

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

Her iki sunucuda aynı kullanıcı kimlik bilgilerini kullanırsanız:

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

3
2017-10-08 01:24





Bunu tersten de yapabilirsiniz ve belki daha kolaydır.

Dosyayı göndermek istediğiniz makineyle açılan bir ssh oturumunuz olduğunu varsayalım. Bu en uçtan uca PC, biz buna hop2 diyeceğiz. "Proxy" sunucunuz hop1 olacak. Dosya kaynaklı PC, biz o kökeni deriz.

origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

Uzak bir bilgisayarda yerel bir bağlantı noktası sağlayan tüneller oluşturabilirsiniz. Böylece, uzak PC'de açmak için bir bağlantı noktası tanımlamaktayız, bu da tüneli oluştururken sizinle birlikte çektiğiniz portun bir yönlendirmesi olacaktır.

Hop2'de:

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

Şimdi açılan tünel oturumunda, aynı şeyi hop1'den file_origin'e yapabilirsiniz.

Hop1'de:

ssh -R 6666:127.0.0.1:5555 <origin_user>@<origin_IP>
#this has the effect of building a tunnel from hop1 to origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on origin as port 6666.

Artık hop2'den hop1'e menşe ediliyorsunuz. Tesadüfen, şimdi 5555 ve 6666 portlarının ikisi de, hop2'nin portu 22'ye yönlendirilen kökene açıktır. Bu oturumda, aşağıdakilerin ikisi de hop2'ye giden geçerli scp rotalarıdır:

Kökenli:

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

Bu sayede, aralarında birkaç sayıda atlama olabilir ve iki atlamadan daha fazla bir araya getirme konusunda çalışmak daha kolaydır.


2
2017-11-18 20:22





Birden çok ana makine için kullanılabilecek bir kurulum için aşağıdaki örnek openssh yapılandırmasını uyarlamayı deneyin:

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

Bu, "uat-" ile başlayan ve yalnızca jumpbox / gateway server "bastion-uat" üzerinden erişilebilen bir dizi sunucu varsaymaktadır. Büyük olasılıkla eklemek istersiniz ForwardAgent yes Giriş yapmak için bir anahtar kullanıyorsanız.


1
2018-06-25 10:33



Kullanma ForwardAgent yes bunun için. Bu durumda aracı yönlendirmesi gerekli değildir, çünkü ssh istemcisi kalede çalışmamaktadır ve gerekmediğinde bir aracı yönlendirmek yalnızca güvenliği azaltmaktadır. Ve düşünüyorum ssh emrinizden eksik. Son zamanlarda ssh sürüm kullanmanız gerekmiyor nc, Yazabilirsin ssh -W %h:%p bastion-uat yerine. - kasperd
@kasperd ssh dahil olmak üzere düzenlenmiştir. Re ForwardAgent; Bir ssh istemcisi, nc komutunu çalıştırmak için çalışır. Belki de kabuktan bahsediyorsunuz? - Benjamin Goodacre


Bu sk değil (OP istendi), ama kullanımı çok basit buldum rsync ile yerel bir yerden diğerine uzaktan kopyalamak için:

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

Kaynak: http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

Yukarıdaki ProxyPass önerisini denedim ve değişen ihtiyaçlarım için yapılandırmayı değiştirmek istemedim. Yukarıdaki bağlantıdaki yazarın yazdığı gibi, kolondan önceki hedef dosya (:), belirtilen yolun hedef sunucuda olduğunu belirtmek açısından önemlidir. Ayrıca, rsync kullanarak tarih karşılaştırma, klasör senkronizasyonu vb. Seçeneklerine sahipsiniz. Umarım bu birilerine yardımcı olur!


1
2017-12-21 17:07