Multihop SCP transferlerini nasıl yaparım?


85

Bir dosyayı A makinemden C sunucusuna kopyalamak istiyorum, ancak yalnızca C sunucusuna B sunucusuyla erişebiliyorum.

İlk önce B sunucusuna aktarmak yerine, oturum açın ve ardından C sunucusuna aktarın, dosyayı doğrudan SCP veya benzeri programlarla aktarmak mümkün müdür?

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

Yanıtlar:


48

Bunun yerine -oseçenekler ekleyebilirsiniz .scp.ssh/config

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

$jump_host bu durumda "sunucunuz B" dir.


Thi si bunu yapmak için tercih ettiğim yol. Birden fazla atlama için .ssh / config'yi karıştırmak, aynı ana bilgisayara bir ağ geçidinden veya doğrudan erişirseniz en iyi çözüm değildir.
GabrieleV

Bu, farklı / özel kullanıcı adları ve portlarla nasıl olurdu?
Pablo A,

Bunu deniyorum ve şifre girmeliyim. Bunu nasıl düzeltebilirim. Teşekkürler.
hqt

44

OpenSSH varsayarak, SSH yapılandırmanıza .ssh / config içinde ekleyin.

Host distant
ProxyCommand ssh near nc distant 22

Bu, SSH'nin yakın adlı makinede proxy yaparak uzaktaki makineye "doğrudan" bağlanabilmesine neden olur. Daha sonra uzaktaki makineye scp ve sftp gibi uygulamaları kullanabilir.

Bunun için yakındaki isimli makineye kurulu 'nc' aka netcat'e ihtiyacınız var. Fakat bir çok modern sistemde zaten var.

towo'nun katran çözümü, katranın sözdizimini ve çalışma kurallarını ezberlediğinizi varsayarsak, tek seferlik sorunlar için daha etkilidir.


Bu benim kullandığım yöntemdir ... Bu örnekte 'uzak' sunucu C olur ve 'yakın' açıklama için sunucu B olur ...
Jeremy Bouse

Pek çok modern makinede 'nc' yoktur: normalde sadece Linux makinelerinde ve sadece isteğe bağlı olarak kullanılabilir (standart kurulumun bir parçası değildir).
Mei,

1
ssh şimdi -W seçeneğine sahip, bunu 'nc' olmadan otomatik olarak yapıyor, ama neden scp olmadığını merak ediyorum -W
kubanczyk

3
Bu açıkça belli olmayan tek kişi ben değilsem: eğer kullanıcı adı açık olan kullanıcı adından nearfarklıysa distant, yakın kullanıcı girer ProxyCommand ssh nearuser@near...ve uzak kullanıcı ayrı bir User distantusersatıra girer .
Mu Mind

Sadece ssh multi hope yazın ve Google’a kendimi şanslı hissediyorum
chandank

19

(B) makinesinin yanındaki sunucudaki daha yeni ssh sürümleriyle aşağıdakiler netcat olmadan çalışacak:

Host distant
    ProxyCommand ssh near -W distant:22

Bununla birlikte, yakın (B) makinede AllowTcpForwarding'in evet (varsayılan) olmasını gerektirir.

düzenleme: B üzerinde OpenSSH 5.4+ gerektirir


bir cazibe gibi çalışır :)
gongzhitaao 19:13

1
Ve en azından OpenSSH 7.4p1'den itibaren, içinde her kullanıcının sadece @ @ ana bilgisayarını listelemesi gereken bir "ProxyJump" komutu var: port virgüllerle ayrılmış. Güzel!
hmijail

ProxyJump hoş, ancak User ve IdentityFile yapılandırma dosyasından almadı. ProxyCommand -W bunu yapar ve ayrıca scp ile çalışır.
rickfoosusa

18

B sunucusuna ssh gibi bir şey kullanarak yapabilirsiniz

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

Sonra kullanarak C sunucusuna ssh kullanabilirsiniz.

ssh -p 5022 <user_serverC>@localhost 

Benzer şekilde scp kullanarak çalışacak

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

Scp ve ssh ile doğru p durumda kullanmayı unutmayın


5

Kimlik doğrulama için sertifika kullanmanız gerekse bile (AWS ortamlarında tipik) mümkündür ve nispeten kolaydır.

Aşağıdaki komut bir dosya kopyalar remotePathüzerinde server2adresinden makineye doğrudan localPath. Dahili olarak scp isteği proxy üzerinden gönderilir 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 çalışır (dosya yükle):

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

Bunun yerine parola 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ıyorsanız:

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

3

Gerçekten kötü olmak istiyorsan, ssh ve tar gibi bir şey zincirleyebilirsin tar c mydir | ssh server "ssh otherserver | tar x", ama bu tüm sorunların eline geçebilir.

En kolay yol, yalnızca yerleşik SSH yöntemleriyle bir SSH tüneli kurmak olacaktır; -Dmanpage'deki anahtara bakın ve bir bağlantı noktasını diğer sunucunun ssh bağlantı noktasına iletin.


2

Bunu tersten de yapabilirsiniz ve belki daha kolaydır.

Diyelim ki dosyayı göndermek istediğiniz makine ile bir ssh oturumu açtınız. Bu en uzaktaki PC'ye bu hop2 adını vereceğiz. "Proxy" sunucunuz hop1 olacaktır. Dosya kökenli PC, bu köken diyoruz.

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

Uzak bir bilgisayarda yerel bir bağlantı noktasını sağlamak için tüneller oluşturabilirsiniz. Böylece uzak PC'de açılacak bir bağlantı noktası tanımlıyoruz; bu tüneli kurduğunuzda yanınıza aldığınız bağlantı noktasına bir yönlendirme olacak.

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 bu tünel oturumunda, hop1'den file_origin'e aynısını 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 orijinli tünel açıyorsunuz. Tesadüfen, şimdi hem 5555 hem de 6666 numaralı bağlantı noktaları, hop2'nin 22 numaralı bağlantı noktasına yönlendirilen açık kaynaklarda açıktır.

Menşei:

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

Bu şekilde, aralarında isteğe bağlı olarak belirli sayıda atlama sayısı olabilir ve iki şeritten fazla zincirleme bağlamında birlikte çalışmak daha kolaydır.


1

Birden çok ana bilgisayar için kullanılabilecek bir kurulum için aşağıdaki örneği openssh config'i uyarlamayı deneyin:

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

Bu "uat" ile başlayan ve yalnızca atlama kutusu / ağ geçidi sunucusu "bastion-uat" ile erişilebilen bir sunucu kümesini varsayar. Giriş yapmak için ForwardAgent yesbir anahtar kullanıyorsanız muhtemelen eklemek istersiniz .


Bunun için kullanmayın ForwardAgent yes. Bu durumda aracı yönlendirme gerekli değildir, çünkü hiçbir ssh istemcisi temelde çalışmayacaktır ve bir aracı gerekmediğinde iletmek yalnızca güvenliği azaltacaktır. Ve sanırım sshemrinde eksik. Yeni bir sshsürüm kullanılıyorsa nc, gerek kalmaz , ssh -W %h:%p bastion-uatbunun yerine yazabilirsiniz .
kasperd

@ kasperd ssh içerecek şekilde düzenlendi. ForwardAgent'ı yeniden; nc komutunu çalıştırmak için bir ssh istemcisi çalışacaktır. Belki de kabuktan bahsediyorsun?
Benjamin Goodacre

1

Bu scp değil (hangi OP istedi), ancak rsynctek bir atlama üzerinden yerelden uzak noktaya kopyalamayı kullanmanın çok basit olduğunu gördüm :

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 -o ProxyPass önerisini denedim ve değişen ihtiyaçlarım için config değiştirmek istemedim. Yukarıdaki linkteki yazarın işaret ettiği gibi, kolondan (:) önceki hedef dosya belirtilmiş yolun hedef sunucuda olduğunu belirtmek için önemlidir. Ayrıca, rsync'i kullanarak tarih karşılaştırma, klasör senkronizasyonu vb. Seçenekleriniz var. Umarım bu birine yardımcı olur!


-2

scp -o 'ProxyJump jumpboxname' somefilename.txt finaldestinationhost: / tmp /.


3
Buraya biraz açıklanamayan kod atma. Bu sorunun çok sayıda iyi cevabı var ve mevcut olanlara değer katmanız gerekiyor - bu değil.
Sven
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.