it-swarm-tr.com

Multihop SCP transferlerini nasıl yaparım?

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

Önce sunucu B'ye transfer olmak, giriş yapın ve sonra sunucu C'ye transfer etmek yerine, dosyayı doğrudan SCP veya benzeri programlarla aktarmak mümkün müdür?

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

87
sverrejoh

scp yerine -o Yerine .ssh/config Seçeneklerini ekleyebilirsiniz.

scp -o ProxyCommand="ssh $jump_Host nc $Host 22" $local_path $Host:$destination_path

$jump_Host Bu durumda "sunucu B" dir.

48
John Tantalo

OpenSSH varsayarsak, SSH yapılandırmanıza .ssh/config dizininde ekleyin.

Host distant
ProxyCommand ssh near nc distant 22

Bu, SSH'nin yakın adlı makine aracılığıyla proxy oluşturarak uzak adlı makineye "doğrudan" bağlanmasına neden olur. Daha sonra uzaktaki makineye scp ve sftp gibi uygulamaları kullanabilir.

Bunun çalışması için 'nc' adında netcat adında bir makineye kurulu olmanız gerekir. Ancak birçok modern sistem zaten buna sahip olacak.

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

44
tialaramex

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

Host distant
    ProxyCommand ssh near -W distant:22

Ancak AllowTcpForwarding'in yakın (B) makinede evet (varsayılan) olmasını gerektirir

düzenleme: B OpenSSH 5.4+ gerektirir

19
danblack

Ssh sunucusuna B gibi bir şey kullanarak

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

Sonra ssh sunucusunu kullanarak c

ssh -p 5022 <user_serverC>@localhost 

Benzer şekilde scp kullanarak çalışır

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

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

18

Kimlik doğrulama için sertifika kullanmanız gerektiğinde bile (AWS ortamlarında tipiktir) mümkün ve nispeten kolaydır.

Aşağıdaki komut remotePath üzerindeki server2 doğrudan makinenize localPath adresinden. Dahili olarak scp isteği server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>

Diğer yol da işe yarıyor (dosya yükle):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p [email protected]" <localpath> [email protected]:/<remotePath>

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

scp -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>

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

scp -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>
5
donhector

Gerçekten kötü olmak istiyorsan, ssh ve katranı zincirleyebilirsin, tar c mydir | ssh server "ssh otherserver | tar x", ancak bu tüm sorunlara yol açabilir.

Daha kolay yol, yerleşik SSH yöntemleriyle bir SSH tüneli kurmak olacaktır; bak -D Sayfayı açın ve bir portu diğer sunucunun ssh portuna yönlendirin.

3
towo

Bunu tersine de yapabilirsiniz ve belki daha kolaydır.

Dosyayı göndermek istediğiniz makine ile açılmış bir ssh oturumunuz olduğunu varsayalım. Bu en uzak bilgisayar, buna hop2 diyeceğiz. "Proxy" Ana Bilgisayarınız hop1 olacaktır. Dosya Menşei olan PC, biz bu Menşe adını vereceğiz.

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

Uzak bir bilgisayarda yerel bir bağlantı noktası oluşturacak şekilde tüneller oluşturabilirsiniz. Bu nedenle, uzak PC'de açılacak bir bağlantı noktası tanımlıyoruz, bu da tüneli inşa ettiğinizde yanınıza aldığınız bağlantı noktasına bir yönlendirme olacaktır.

Atlama2:

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, hop1'den file_Origin'e de aynısını yapabilirsiniz.

Atlama1:

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 Origin'e tünel açıyorsunuz. Tesadüfen, şimdi hem 5555 hem de 6666 numaralı bağlantı noktası, Hop2'nin 22 numaralı bağlantı noktasına yönlendiren Origin'de açıktır. Bu oturumda, aşağıdakilerin her ikisi de hop2 için geçerli scp yollarıdır:

Menşe Üzerinde:

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

Bu şekilde, aralarında rasgele sayıda Şerbetçiotu olabilir ve ikiden fazla Şerbetçinin birbirine zincirlenmesi açısından birlikte çalışmak daha kolaydır.

2
SYANiDE

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

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

Bu, yalnızca atlama kutusu/ağ geçidi sunucusu "bastion-uat" üzerinden erişilebilen "uat-" ile başlayan bir dizi sunucuyu varsayar. Muhtemelen ForwardAgent yes giriş yapmak için bir anahtar kullanıyorsanız.

1

Bu scp (hangi OP talep) değil, ama ben ile tek bir hop üzerinden yerel kopyalamak için rsync kullanmak süper basit buldum:

rsync -v -e 'ssh -A -t [email protected] ssh -A -t [email protected]' /path/to/sourcefile :/path/to/destination

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

Yukarıdaki -o ProxyPass öneri denedim ve değişen ihtiyaçları için yapılandırma değiştirmek istemiyordu. Yukarıdaki bağlantıdaki yazarın belirttiği gibi, belirtilen yolun hedef sunucuda olduğunu belirtmek için iki nokta üst üste (:) olan hedef dosya önemlidir. Ayrıca, rsync kullanarak, tarih karşılaştırma seçenekleri, klasör senkronizasyonu, vb var. Umarım bu birine yardımcı olur!

1
texas-bronius