İkinci bir uzak ana bilgisayarla nasıl scp yapılır


83

Remote2 ana bilgisayardan dosyayı doğrudan yerel makinemden bir remote1 ana bilgisayardan geçerek SCP yapmanın bir yolu olup olmadığını merak ediyorum.

Ağlar yalnızca remote1 ana bilgisayarından remote2 ana bilgisayarına bağlantılara izin verir. Ayrıca, ne remote1 host ne de remote2 host yerel makineme scp gönderemiyor.

Gibi bir şey var mı:

scp user1@remote1:user2@remote2:file .

İlk pencere: ssh remote1ardından scp remot2:file ..

İkinci kabuk: scp remote1:file .

İlk pencere: rm file; logout

Tüm bu adımları uygulamak için bir senaryo yazabilirim, ancak doğrudan bir yol varsa onu kullanmayı tercih ederim.

Teşekkürler.

DÜZENLEME: SSH tünellerini açmak gibi bir şey düşünüyorum ama nereye koyacağım konusunda kafam karıştı.

Şu anda, erişmek remote1için $HOME/.ssh/configyerel makinemde aşağıdakilere sahibim.

Host remote1
   User     user1
   Hostname localhost
   Port     45678

remote1Erişim için bir kez remote2, standart yerel DNS ve bağlantı noktası 22'dir. Neyi takmalı remote1ve / veya değiştirmeliyim localhost?

Yanıtlar:


95

Dosyayı doğrudan tek bir komutla kopyalamanın herhangi bir yolunu bilmiyorum, ancak yalnızca bir bağlantı noktası yönlendirme tünelini açık tutmak için arka planda bir SSH örneği çalıştırmayı kabul ederseniz, dosyayı tek bir komutla kopyalayabilirsiniz.

Bunun gibi:

# First, open the tunnel
ssh -L 1234:remote2:22 -p 45678 user1@remote1
# Then, use the tunnel to copy the file directly from remote2
scp -P 1234 user2@localhost:file .

user2@localhostAsıl scpkomutta olduğu gibi bağlandığınızı unutmayın , çünkü ilk sshörneğin ileri bağlantılarını dinlediği localhost üzerindeki 1234 numaralı bağlantı noktasındadır remote2. Ayrıca, sonraki her dosya kopyası için ilk komutu çalıştırmanız gerekmediğini unutmayın; basitçe çalışır durumda bırakabilirsiniz.


1
Teşekkürler, bu ihtiyacım olan şeye yakın görünüyor. Bu yüzden tüneli oluşturdum, parmak izi sunucunun parmak izi ile eşleşiyor, ancak bir "İzin reddedildi (publickey)" hatası alıyorum. Sanırım ağıma / sistem yöneticime neden çalışmadığını sormam gerekiyor.
Danosaure

3
Teşekkürler! Ben değiştirmek zorunda -p 45678için -p 22benim Uzaktan 1 SSH bağlantı 22 dinliyor olarak
Montaro

Bunun -p 22yerine kullanmak zorunda kaldım -p 45678. scp -P 1234 ...Benim için de çalışmıyor. Alıyorum ssh: connect to host localhost port 1234: Connection refused. Denediğimde scp -P 22 ...işe yarıyor, ancak dosyayı remote 1yerel makinemde ( remote2) değil de kopyalıyor .
günahkar

Aynı için herhangi bir UI aracı var mı?
ExploringApple

70

Çift ssh

Karmaşık durumunuzda bile, dosya aktarımını tek bir komut satırı kullanarak, basitçe ssh;-) ile gerçekleştirebilirsiniz
Ve bu, şunlara remote1bağlanamıyorsanız kullanışlıdır localhost:

ssh user1@remote1 'ssh user2@remote2 "cat file"' > file

tar

Ancak dosya özelliklerini (sahiplik, izinler ...) kaybedersiniz.

Ancak, tararkadaşınız şu dosya özelliklerini koruyacak mı:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar c file"' | tar x

Ağ bant genişliğini azaltmak için de sıkıştırabilirsiniz:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj file"' | tar xj

Ayrıca tarözyinelemeli bir dizini temel olarak aktarmanıza olanak tanır ssh:

ssh user1@remote1 'ssh user2@remote2 "cd path2; tar cj ."' | tar xj

ionice

Dosya çok büyükse ve diğer önemli ağ uygulamalarını rahatsız etmek istemiyorsanız, ve araçları tarafından sağlanan ağ aktarım hızı sınırlamasını kaçırabilirsiniz (örneğin , 1 Mbits / saniyeden fazlasını kullanmazlar).scprsyncscp -l 1024 user@remote:file

Ancak, ionicetek bir komut satırını tutmak için bir geçici çözüm kullanılıyor :

ionice -c2 -n7 ssh u1@remote1 'ionice -c2 -n7 ssh u2@remote2 "cat file"' > file

Not: ioniceeski dağıtımlarda bulunmayabilir.


Tüm açıklamalar için teşekkürler, ancak Dolda2000'in çözümünün daha kolay olduğunu düşünüyorum. Denediğim bir şeydi ama çözemedim.
Danosaure

5
Bu olağanüstü iyi bir cevap ve daha fazla oyu hak ediyor. Ayrıca bence kabul edilen cevaptan çok daha kolay.
Rik Smith-Unna

2
Bunun kabul edilen cevaptan daha iyi bir çözüm olduğuna katılıyorum. Bu şekilde bağlantı otomatik olarak temizlenir.
Doug

Teşekkür ederim, çok güzel cevap! Yerelden uzaktan kopyalamaya ne dersiniz?
DomTomCat

31

Bu hile yapacak:

scp -o 'Host remote2' -o 'ProxyCommand ssh user@remote1 nc %h %p' \ 
    user@remote2:path/to/file .

Dosyayı remote2doğrudan ana bilgisayardan SCP'ye tabi tutmak için , iki seçeneği ( Hostve ProxyCommand) ~ / .ssh / config dosyanıza ekleyin ( süper kullanıcıyla ilgili bu yanıta da bakın ). O zaman çalıştırabilirsiniz:

scp user@remote2:path/to/file .

yerel makinenizden düşünmek zorunda kalmadan remote1.


Güzel yaklaşım! Yine -o 'Host remote2'de komut satırından başlatılırken gerçekten gerekli görünmüyor (yani ~ / .ssh / config'e dokunmadan bir kez kopyalamak için)
Mike

Burada aynı. Bu benim için onsuz çalışıyor -o 'Host remote2'. Teşekkürler.
günahkar

7

Openssh sürüm 7.3 ve üstü ile bu çok kolay. Yapılandırma dosyasında ProxyJump seçeneğini kullanın .

# Add to ~/.ssh/config 
Host bastion
    Hostname bastion.client.com
    User userForBastion
    IdentityFile ~/.ssh/bastion.pem

Host appMachine
    Hostname appMachine.internal.com
    User bastion
    ProxyJump bastion                   # openssh 7.3 version new feature ProxyJump
    IdentityFile ~/.ssh/appMachine.pem. #no need to copy pem file to bastion host  

Oturum açmak veya kopyalamak için çalıştırılacak komutlar

ssh appMachine   # no need to specify any tunnel. 
scp helloWorld.txt appMachine:.   # copy without intermediate jumphost/bastion host copy.** 

Tabii ki, yapılandırma dosyasında yapılandırılmamışsa, ssh komutuna "-J" seçeneğini kullanarak burç Jump ana bilgisayarını belirtebilirsiniz.

Not scp yok değil şu andan itibaren "-J" bayrağını destekler niteliktedir. (man sayfalarında bulamadım. Ancak yukarıdaki scp, yapılandırma dosyası ayarıyla çalışır)


1
Yalnızca proxy oluşturma için kullanılıyorsa (yani farklı bir IdentityFile vb. Yoksa), bastion sunucusunu yapılandırma dosyasına eklemeye gerek yoktur, sadece ProxyJump bastion.client.com'u appMachine bölümüne ekleyin.
Tomer Cohen

1

scpSon zamanlarda tam olarak bu aynı iş için eklenen yeni bir seçenek var, bu çok uygun -3.

TL; DR ssh yapılandırma dosyalarında önceden ayarlanmış kimlik doğrulaması olan mevcut ana bilgisayar için şunları yapın:

scp -3 remote1:file remote2:file

Sizin scpson sürümlerinden olmalıdır.

Bahsedilen diğer tüm teknikler, uzak1'den uzak2'ye veya tam tersi kimlik doğrulaması ayarlamanızı gerektirir, bu her zaman iyi bir fikir değildir.
Bağımsız değişken -3, mevcut ana bilgisayarı aracı olarak kullanarak iki uzak ana bilgisayardan dosyaları taşımak istediğiniz anlamına gelir ve bu ana bilgisayar, kimlik doğrulamasını her iki uzak ana bilgisayara da yapar, böylece birbirlerine erişmeleri gerekmez.
Sadece oldukça kolay ve iyi belgelenmiş olan ssh yapılandırma dosyalarında kimlik doğrulaması ayarlamanız ve ardından komutu TL; DR'de çalıştırmanız yeterlidir.

Bu cevabın kaynağı https://superuser.com/a/686527/713762


0

Bu konfigürasyon benim için iyi çalışıyor:

Host jump
   User username
   Hostname jumphost.yourorg.intranet
Host production
   User username
   Hostname production.yourorg.intranet
   ProxyCommand ssh -q -W %h:%p jump

Sonra komut

scp myfile production:~

Kopya myFile için üretim makinesi.


0

Bu kaynağı kullanarak üzerinde çalıştığım Olibre'nin çözümüne küçük bir katkı .

Eğer kullanım için üç yol var gibi taryerel uzak ana bilgisayardan kopyalama, uzak ana yerel ana bilgisayar için aşağıdaki eserlerini çift SSH durumlarda kopyalama: (onları çalıştırmak içinde dosyaların kopyalanması gereken dizinde, aksi fullpath kullanmak /dosya adı)

Tek dosyayı sıkıştırmadan aktarın:

tar c filename |  ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar x"'

Tek dosyayı sıkıştırarak aktarın:

tar cj filename |  ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar xj"'

Yinelemeli dizin aktarımı:

tar cj . |  ssh user1@remote1 'ssh -Y user2@remote2 "path2 && tar xj"'

Buradaki &&, komutun ilk yarısı çalışmazsa - örneğin dizin eksikse veya kaynak / hedef yol adlarında bir hata varsa, komutun çalışmasını engeller.

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.