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).
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.
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.
(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
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
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>
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.
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.
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.
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!