Tek bir komutla A üzerinden B makinesini nasıl SSH yapabilirim?

69

Bir bilgisayara erişmek istiyorum, üniversitemin ağında bulunan makine A deyin. Ancak, bu bilgisayara yalnızca üniversitenin dahili ağı üzerinden erişilebilir, bu yüzden SSH'yi doğrudan bu bilgisayardan evde kullanamıyorum.

İşte şimdi ne yapıyorum:

  1. Farklı bir üniversiteye giriş yapın, makine B

    deyin

    (Bu makineye B ev bilgisayarımdan SSH üzerinden erişilebilir.)

  2. A'ya bağlanmak için B'de SSH'yi kullanın.

Bunu daha hızlı yapmanın bir yolu var mı? Sadece bir ssh komutu kullanarak.

    
sordu nikosdi 22.06.2013 17:03

6 cevap

76

Evet, SSH yapılandırmanızda ProxyCommand kullanma.

Ev dizininizde bir SSH yapılandırma dosyası oluşturun (sistem genelinde bunu yapmak istemediğiniz sürece), ~/.ssh/config :

Host unibroker          # Machine B definition (the broker)
Hostname 12.34.45.56    # Change this IP address to the address of the broker
User myusername         # Change this default user accordingly 
                        # ('[email protected]' can overwrite it)

Host internalmachine    # Machine A definition (the target host)
ProxyCommand ssh -q unibroker nc -q0 hostname.or.IP.address.internal.machine 22

Artık Makina A'ya doğrudan kullanarak ulaşabilirsiniz

ssh [email protected]

Ayrıca, bunun için tek bir SSH ana bilgisayar hedef adınız olduğunu unutmayın. Bunu diğer uygulamalarda da kullanabilirsiniz. Örn:.

Notlar

hostname.or.IP.address.internal.machine ve bağlantı noktasını ( 22 ), unibroker makineden yaptığınız gibi ulaşmak istediğiniz makineye değiştirin.

Unibroker ana bilgisayardaki netcat sürümlerine bağlı olarak, -q0 seçeneğinin atlanması gerekir. Kimlik doğrulaması ile ilgili olarak; Temel olarak iş istasyonunuzdan iki SSH bağlantısı kuruyorsunuz. Bu, hem unibroker host hem de internalmachine ana bilgisayarının birbiri ardına doğru doğrulanmış / doğrulanmış olduğu anlamına gelir (hem anahtar parola / şifre hem de ana anahtar doğrulama için).

Açıklama

ProxyCommand ve 'netcat' kullanımının bu yaklaşımı, bunu yapmanın sadece bir yoludur. Bunu beğendim, çünkü SSH istemcim doğrudan hedef makineye konuşuyor, böylece ana bilgisayar anahtarını istemcimden doğrulayabiliyorum ve genel anahtar kimlik doğrulamayı broker üzerinde başka bir anahtar kullanmadan kullanabilirim.

Her Host yeni bir ana makine bölümünün başlangıcını tanımlar. Hostname , o ana bilgisayarın hedef ana bilgisayar adı veya IP adresidir. User , kullanıcı yüzdesi olarak ssh [email protected] olarak verdiğiniz şeydir.

Hedef makineye boru olarak

ProxyCommand kullanılacaktır. SSH'yi ilk makineye kullanarak ve doğrudan oradan hedefe basit bir 'netcat' ( nc ) ayarlayarak, bu temelde sadece aralarındaki komisyoncudan iç makineye uzanan bir düz metin. % Co_de% seçeneği herhangi bir çıkışı (sadece kişisel bir tercih) susturmak içindir.

Aracıda netcat'in kurulu olduğundan emin olun (genellikle Ubuntu'da bulunur) - netcat-openbsd < img src="https://hostmar.co/software-small"> veya netcat-geleneksel < img src="https://hostmar.co/software-small"> .

Halen iki kez şifrelemeyle SSH kullandığınızı unutmayın. Netcat kanalı düz metin olsa da, PC'nizdeki SSH istemciniz son hedef makine ile başka bir şifreli kanal kuracaktır.

    
verilen cevap gertvdijk 22.06.2013 17:24
36

Tek seferde hop

Diğer yanıtım 'da sağladığım ProxyCommand yaklaşımına bariz bir alternatif, doğrudan hedef makineye "atlamalı" olur :

ssh -t [email protected] ssh [email protected]

% -t komutunun ssh 'sine dikkat edin. Bu olmadan, başarısız olur:

Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied, please try again.
[...]

Tahsis edilecek gerçek bir TTY zorlayacaktır

Bunun dezavantajı, şimdi tüm yapılandırma, doğrulama ve kimlik doğrulama işlemlerinin güvenlik nedenleriyle benim durumumdan gerçekten hoşlanmadığım Machine B'de gerçekleşmesidir. Anahtar bilgisayarımı kendi bilgisayarımda seviyorum ve nihai bilgisayarımı kendi bilgisayarımdan doğrulayıp doğruladım. Ayrıca, etkileşimli kabuğu yalnızca SSH için kullanabilirsiniz, bu yüzden SCP gibi diğer araçlarla veya GUI dosya yöneticinizle ilgilenmeyecektir.

Yukarıda belirtilen nedenlerden ötürü, ProxyCommand yaklaşımını tavsiye ederim, ancak hızlı bağlantı için bu iyi çalışıyor.

    
verilen cevap gertvdijk 22.06.2013 17:47
14

Kullanmayı deneyin

Host <visible hostname alias>
        Controlmaster auto
        User <user>
        hostname <visible hostname>
        port <port>
        IdentityFile ~/.ssh/<id file>

Host <private LAN hostname alias>
     ProxyCommand ssh -q -W <private LAN hostname>:<private LAN port> <visible hostname alias>

~ / .ssh / config değerinizde ve hepsini tek bir çekimde, yalnızca bilgisayarınızda bulunan tuşlarla yapın.

    
verilen cevap SSH Help 29.07.2014 15:49
11

-J komut satırı seçeneğini kullanabilirsiniz:

ssh -J [email protected] [email protected]

man ssh 'den:

-J [[email protected]]host[:port]
     Connect to the target host by first making a ssh connection to
     the jump host and then establishing a TCP forwarding to the
     ultimate destination from there.  Multiple jump hops may be
     specified separated by comma characters.  This is a shortcut to
     specify a ProxyJump configuration directive.

OpenSSH sürüm 7.3'te (Ağustos 2016'da yayımlandı) tanıtıldı. Ubuntu 16.10 ve sonrasında kullanılabilir.

    
verilen cevap Erik Sjölund 16.01.2018 17:19
1

ProxyCommand, her iki sistemde de kabuk erişimine izin verdiğinizde, bir durum için temiz bir çözümdür. Uzaktaki kullanıcılara bir iç makine (A) 'ya bir aracı (B) aracılığıyla erişim sağlamak istedik, ancak kullanıcıya daha iyi bir güvenlik sağlamak için B'ye bir kabuk erişimi sağlamadık. Bu çalıştı:

Giriş kabuğunu değiştirin

Aşağıdaki kod ile (dosyada saklanan) broker üzerinde chsh için giriş kabuğunu ( extuser kullanın) değiştirin:

#!/bin/sh   # this is essential to avoid Exec format error
ssh [email protected]

Uzak kullanıcı için extuser @ B'de ve extuser @ B için internaluser @ A'da parola girişi ayarlanmadıysa, aşağıdaki komutu yürütmek doğrudan uzaktaki kullanıcıyı A

olarak alır.
ssh [email protected]

İpucu : Özel giriş kabuğuna geçmeden önce extuser @ B'de gerekli olan parola login authorized_keys ayarını oluşturun. Değişiklikten sonra, bu hesaba bir kabuk aracılığıyla kimseye erişilemediğinden, yalnızca bir sudoer @ B, doğrudan düzenleyerek authorized_keys dosyasında değişiklik yapabilir.

sudo vi ~extuser/.ssh/authorized_keys
sudo touch ~extuser/.hushlogin

Son satır, giriş afiş ekranını B'den bastırmaktır, böylece uzak kullanıcı A'ya şeffaf bir erişim sağlar.

    
verilen cevap Sunthar 08.06.2016 20:27
0

Bu çok yardımcı bir öneri. Saatlerce uğraştıktan sonra, bu notu buldum & amp; bunun tam olarak belgelendiği gibi çalıştığını doğruladı. MachineA'dan uzak makineden MachineB'ye bağlanmak için:

örneğin: [xuser @ makineC ~] ssh -t MakineA ssh MachineB

"-t" kritiktir, eğer mevcut değilse ssh başarısız olur. MachineA'da parola için iki kez, sonra ikinci kez sorulur MachineB. Ayrıca, bunun hepsinde tanımlanmış "xuser" kullanıcısına sahip olduğunu varsayar. üç makine. Değilse, sadece ssh sözdizimini kullanın: "yuser @ MachineA ...". Ayrıca dikkat edin İsterseniz, noktalı dört ham IP # s kullanabilirsiniz. Bağlantınız varsa bu yararlıdır Dünyaya maruz kalmayan IP'leri kullanan özel bir yerel ağdan - yani. değil Yerel ana makine dosyanız veya herhangi bir DNS. MachineB'den uzak makineyeC bir dosya almak için MachineB'den MachineA'ya, ardından MachineA'dan uzak machineC'ye scp yapabilirsiniz. (Ör. Uzak makineC MachineA ping ancak MachineB ping.) Caveat: Ben Fedora ve WindowsXP ile test, MachineA bir XP-box çalışan ICS (Internet Bağlantı Paylaşımı), MachineB ve uzak machineC ise Fedora-Linux kutuları. Bu öneri benim için önemli bir problemi çözdü - yani. uzak sitem için kısıtlı, izlenen uzaktan erişim lan. Ayrıca, MachineB'den "çıkış" yaptığınızda, iki adet "xxx.xxx.xxx.xxx bağlantısı kapatıldı" seçeneğini görmeniz gerekir. mesajlar.

    
verilen cevap Mcl 17.04.2014 00:34

Etiketlerdeki diğer soruları oku