Bir sunucudaki stdout'u başka bir sunucuda stdinlemek için bağlayabilir miyim?


74

stdoutbir CentOS sunucusunda stdin, başka bir CentOS sunucusuna yönlendirilmesi gerekir. Mümkün mü?

Güncelleme

ScottPack, MikeyB ve jofel hepsinin geçerli cevapları var. Scott'a cevabı verdim, çünkü sorumun güvenliği bir gereklilik olarak belirtmemiş olmasına rağmen, güvende olmak her zaman güzeldir. Ancak, diğer iki arkadaşın önerileri de işe yarayacak.


1
Ssh dışı yaklaşımın (sadece) en büyük avantajının çıkış hızı olduğunu belirtmekte fayda var; Eğer hızlı bir ağdaysanız ve güvenlik gerekli değilse, bu iki komutu iki pencereye yazmaktan rahatsız edici olabilir.
Random832 16.06

Yanıtlar:


94

Bu hiç hazırlıksız bir evet.

Bir sshuzak sunucudaki bir komutu çalıştırmak için kullanıldığında, bir çeşit fantezi dahili giriş / çıkış yönlendirmesi gerçekleştirir. Aslında, bunu OpenSSH'nin en ince özelliklerinden biri olarak buluyorum. Özellikle, sshuzak bir sistemde keyfi bir komut yürütmek için kullanırsanız , ssh STDINve STDOUTyürütülen komutunki ile eşleşecektir.

Bir örnek için, yedek bir tarball oluşturmak istediğinizi, ancak yerel olarak saklamak istemediğinizi veya yapamayacağınızı varsayalım. Bu sözdiziminde bir göz atalım:

$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"

Bir tarball yaratıyoruz ve STDOUTnormal şeyler yazıyoruz . Biz uzak bir komut çalıştırmak için ssh kullandığınız için, STDIN eşleştirilmiş alır STDINait cat. Hangi sonra bir dosyaya yönlendiririz.


11
Bu herhangi bir "fantezi iç giriş / çıkış yönlendirmesi" değildir - yalnızca normal ve sıkıcı şeylerdir. ssh, diğer herhangi bir araç gibi, STDIN'den okur ve uzaktan işleme geçirir. :)
Daniel Pittman

7
@ DanielPittman: Ama "süslü iç" çöp olarak adlandırmak çok daha eğlenceli .
Scott Pack,

7
Benzer şekilde, netcather iki ucunda da basit, kolay bir iletişim kanalı yaratır. tar cf - /path/to/dir | nc 1.2.3.4 5000bir sunucuda, nc -l -p 5000 > backupfile.tardiğerinde.
MikeyB

1
@ MikeyB: İyi nokta. Netcat bir açık metin protokolüdür, bu nedenle hassas verilerle dikkatli olun. Netcat'ı yerel ağ üzerinden ağ sürücü satın alma (aladd) ve bağlantı noktası taraması gibi daha belirli şeyler için kullanma eğilimindeyim.
Scott Pack,

2
@MikeyB: Sizler ne uçağınızla ve pantolonlarınızla oturuyorsunuz!
Scott Pack,

28

Kablo üzerinden güvenlik konusunda endişelenmenize gerek olmadığında ana bilgisayarlar arasında veri aktarmanın uygun bir yolu netcat, bağlantının iki ucunda da kullanmaktır .

Bu, onları zaman uyumsuz olarak ayarlamanıza da izin verir:

"Alıcı" hakkında (gerçekten, iki yönlü iletişim kuracaksınız, ancak böyle düşünmesi daha kolay), koş:

nc -l -p 5000 > /path/to/backupfile.tar

Ve "gönderen" üzerinde koşun:

tar cf - /path/to/dir | nc 1.2.3.4 5000

Bilmek çok iyi. Fiziksel bağlantı belki bir yedekleme ağı gibi güvenilirse veya bağlantı önceden kuruluysa, bu iyidir.
Wesley

Veya veriler zaten halka açık bir şeyse.
Samuel Edwin Ward

1
+1 netcat, özellikle çalışan bir ssh sunucunuz olmadığı zaman çok değerli bir araçtır.
kwarrick

21

Tek ve çift yönlü bağlantılar oluşturmak için çok güçlü bir araçtır socat. Olanaklara kısa bir bakış için kendi sayfasındaki örneklere bakın .

Tamamen değiştirir netcatve benzer araçları tamamen ssl şifreli bağlantılar için destekler. Yeni başlayanlar için yeterince basit olmayabilir, ama en azından onun var olduğunu bilmek iyi.


1
@WesleyDavid: "Güncellemenize": Sadece bütünlük için, socat’ın SSL desteğine sahip olduğuma cevabımı ekledim, bu yüzden şifreleme de socat ile mümkün. Ancak, ssh çoğu durumda daha iyi ve kolay bir çözümdür, bu yüzden ScottPack'in cevabını da seçerdim.
jofel

5

TL; DR

İşler yalnızca , kullanılması gereken bir bastion sunucunuz olduğunda biraz daha karmaşıklaşır .

  1. Beğenmek sshiçin komut olarak geçebilirsiniz ssh:

    • cat local_script.sh | ssh -A usera@bastion ssh -A userb@privateserver "cat > remote_copy_of_local_script.sh; bash remote_copy_of_local_script.sh"
  2. Sahte terminallere dikkat edin


Buradaki sshen önemli hususun, çoğu araç gibi, yalnızca varsayılan olarak davrandığı stdoutve stdindüzeltildiğini unutmayın.

Ancak, gibi seçeneği görmeye başladığınızda Disable pseudo-terminal allocation.ve Force pseudo-terminal allocation.biraz deneme yanılma yapmanız gerekebilir. Ancak, genel bir kural olarak, ttyterminal emülatöründeki (ne tür bir insan türü) bozuk / ikili hurdalığı düzeltmeye çalışmadığınız sürece davranışınızı değiştirmek istemezsiniz .

Örneğin, -Atiş istasyonumun ssh-agent'ının yönlendirilmesi ve tmux'un uzaktan çalıştırılmasının ikilik demiri yapmaması için kullanma eğilimindeyim ssh -At bastion.internal tmux -L bruno attach. Ve, liman işçisi için de (öyle sudo docker exec -it jenkins bash).

Ancak, bu iki -tbayrak, bunun gibi bir şey yapmaya çalıştığımda, veri bozulmalarını tespit etmekte zorlanıyor:

# copy /etc/init from jenkins to /tmp/init in testjenkins running as a container
ssh -A bastion.internal \
ssh -A jenkins.internal \
sudo tar cf - -C /etc init | \
sudo docker exec -i testjenkins \
bash -c 'tar xvf - -C /tmp'

# note trailing slashes to make this oneliner more readable.

2

Ssh public anahtarınızı başka bir ana bilgisayara yalnızca bir komutla yerleştirmeyi deneyin

ssh root@example.com 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub

2

Bunu en kolay buluyorum, komutu çalıştırmakta olduğunuz kullanıcı için sunucular arasında hiçbir parola el sıkışma ayarladıktan sonra:

sıkıştırılmamış

tar cf - . | ssh servername "cd /path-to-dir && tar xf -"

Anında Sıkıştırma

tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"

Sıkıştırma için sshzaten yapılandırılmışsanız , tar dosyasında sıkıştırma kullanmak çok kötü bir fikirdir .
Anthon

@Anthon Neden bu kadar kötü ve ssh sıkıştırmasının etkin olup olmadığı nasıl kontrol edilebilir?
Tom Hale,

1
@TomHale Sisteminizin hızına bağlı olarak, ikinci sıkıştırma zaman aldığından, genel işlemi yavaşlatabilir, ancak ek baytları tıraş etmeniz olası değildir. Compressionconfig dosyalarının herhangi birinde ayarlanmış olabilir, bunun için hızlı bir kontrol ssh -v localhost exit 2>&1 | fgrep -i compress, herhangi bir çıktı verip vermediğini görmek içindir (AFAIK, ssh'nin okuduğu şekilde konfigürasyonu boşaltma seçeneği yoktur).
Anthon,

tarBir sahiptir -C pathikisi için çalışır bayrağı cve xkomutları. cdOraya ayrı bir komut vermek zorunda değilsin . (Ancak, tek bir emirden daha fazlasını çalıştırabileceğinizi not etmek iyidir.)
Bruno Bronosky,

@Bruno, -Cbir GNU eklentisidir (şimdi bsdtar ve schily tar tarafından da desteklenmektedir)
Stéphane Chazelas 21:17
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.