Saya memiliki server, bernama gamma
, terus-menerus beroperasi di tempat kerja. Kadang-kadang saya menghubungkannya dari di rumah, dalam hal ini saya menggunakan alamat IP publik 55.22.33.99
. Terkadang, saya terhubung ketika saya sedang bekerja, dan bukannya memantulkan paket saya ke tempat yang tidak perlu, saya terhubung melalui alamat IP lokal 192.168.1.100
,.
Saat ini, saya membaginya menjadi dua entri yang berbeda ~/.ssh/conf
Host gamma-local
HostName 192.168.1.100
Port 22
User andreas
Host gamma-remote
HostName 55.22.33.99
Port 12345
User andreas
Jadi, jika saya sedang bekerja, yang harus saya ketik adalah ssh gamma-local
dan saya masuk; jika saya di rumah (atau di mana pun di dunia), saya lari ssh gamma-remote
.
Saat menghubungkan ke server, saya lebih suka tidak harus mengetik nama yang berbeda tergantung di mana saya berada, saya lebih suka bagian itu dilakukan secara otomatis; misalnya, dalam beberapa kasus saya memiliki skrip otomatis yang menghubungkan yang tidak tahu keberadaan saya.
Ada pertanyaan yang memecahkan masalah ini dengan menggunakan skrip Bash untuk "mencoba" menyambung ke lokal terlebih dahulu, dan jika tidak terhubung, coba sambungkan ke alamat IP jarak jauh. Ini bagus, tetapi (1) tampaknya tidak efisien (terutama karena kadang-kadang Anda harus "menunggu" koneksi ke time out karena mereka tidak selalu mengirim kesalahan segera kembali) dan (2) membutuhkan Bash dan menyeret skrip.
Apakah ada cara alternatif untuk mencapai hal ini yang tidak bergantung pada penggunaan skrip Bash, atau "pengujian" untuk melihat apakah koneksi berfungsi terlebih dahulu?
/etc/hosts
atau file konfigurasi SSH untuk mencapai ini? Atau mungkin beberapa cara "mendeteksi" LAN mana yang saat ini terhubung?Jawaban:
Jika Anda memiliki cara untuk mengenali jaringan yang Anda gunakan maka Anda dapat menggunakan
Match
kata kunci~/.ssh/config
untuk melakukan apa yang Anda inginkan. Ini membutuhkan OpenSSH ≥6.5.Saya menggunakan sesuatu yang mirip dengan
Jadi saya menggunakan pengidentifikasi dari jaringan wifi yang digunakan untuk memutuskan apakah saya di rumah untuk keperluan koneksi SSH, tetapi memeriksa alamat IP yang ditugaskan untuk komputer Anda atau hal lain yang membedakan kedua jaringan dapat digunakan juga .
sumber
Match
, terima kasih! Mungkin ide yang baik untuk membungkus deteksi menjadi skrip yang keluar dengan status keluar nol atau tidak nol, karena itu akan membuatnya dapat digunakan kembali.ProxyCommand nc $address ssh
, tetapi kemudian mis. apakah semua perangkat memiliki kunci host yang sama? Ad jika Anda harus menetapkan variabel lingkungan, bukankah akan lebih mudah untuk memberikan alamat untuk terhubung secara langsung sebagai argumenssh
?Jika Anda memiliki server nama pribadi di kantor dan jika Anda menggunakan laptop yang sama dari kantor dan rumah, Anda dapat memanfaatkan itu untuk mencapai ini:
nsswitch.conf
di mesin Anda untuk memeriksa DNS terlebih dahulugamma
diselesaikan hingga 192.168.1.100 di DNS pribadi Anda di kantor.gamma
ke 55.22.33.99.Dengan cara ini, ketika Anda
ssh gamma
dari kantor, itu akan menyelesaikan dari DNS kantor ke 192.168.1.100 dan ketika Anda terhubung dari rumah, itu akan menyelesaikan ke 55.22.33.99 dari file host Anda.PS : Jawaban ini mengasumsikan bahwa Anda tidak ingin gamma memiliki entri DNS publik. Juga, jika Anda SSHing ke server Anda dari mesin Windows, saya pikir harus ada tempat yang setara dengan file nssswitch.conf untuk mengganti entri file hosts.
sumber
Saya tidak tahu apakah mungkin untuk melakukan ini melalui
~/.ssh/config
tetapi pendekatan lain akan terhubung ke satu atau yang lain berdasarkan alamat IP eksternal Anda. Karena, mungkin, ketika Anda sedang bekerja, IP Anda akan55.22.33.NNN
, Anda dapat menjalankan sesuatu seperti:Pendekatan yang lebih sederhana adalah dengan menggunakan IP internal Anda. Saya tidak tahu bagaimana dua jaringan Anda diatur tetapi jika mudah untuk menentukan apakah Anda sedang bekerja atau tidak melalui IP Anda (misalnya, jika Anda memiliki IP tertentu di tempat kerja, seperti
192.168.1.12
), Anda dapat melakukannya ( ubaheth0
ke apa pun nama kartu jaringan Anda):Apa pun yang Anda putuskan untuk digunakan, Anda dapat menambahkannya sebagai alias ke shell Anda (tambahkan baris ini ke file inisialisasi shell Anda,
~/.bashrc
jika Anda menggunakanbash
):Anda juga dapat menjadikannya skrip jika Anda ingin skrip lain memiliki akses ke skrip tersebut (alias
.bashrc
tidak dibaca saat menjalankan skrip).sumber
Anda tidak dapat mencapai ini~/.ssh/config
ketika menggunakan alamat IP sebagai nama host. Komplikasi tambahan diperkenalkan oleh fakta, bahwa Anda tidak hanya menghubungkan ke alamat IP yang berbeda tetapi juga port yang berbeda, karena itu cukup banyak aturan dari setiap tweaker dari resolver DNS Anda.Saya berdiri dikoreksi - Anda dapat menggunakan
Match originalhost ... exec ...
combo di~/.ssh/config
- lihat jawaban @ MichałPolitowski . Namun, meskipun itu akan berfungsi dengan baik untuk OpenSSH, Anda mungkin tidak perlu menemukan fungsionalitas serupa di klien SSH lainnya.Anda dapat mengatasi masalah menggunakan pembungkus sederhana (baik fungsi shell atau skrip jika Anda perlu menggunakannya dari berbagai shell)
ssh
, yang akan memeriksa jaringan apa yang Anda gunakan dan menggunakanHost
entri yang sesuai . Pertanyaan besarnya adalah, bagaimana cara mendeteksi dengan andal jaringan Anda saat ini. Alamat IP lokal muncul di pikiran, tetapi tidak dapat diandalkan, karena Anda mungkin juga menghubungkan dari LAN yang menggunakan subnet yang sama dengan jaringan kerja Anda.Jika Anda dapat memiliki port yang sama untuk jaringan lokal dan jarak jauh, Anda dapat mengedit
/etc/resolv.conf
tergantung pada jaringan yang Anda gunakan - jelas itu harus dilakukan secara otomatis (kemungkinan besar dari skrip kait klien DHCP Anda). Atau - lebih baik - jalankan server nama lokal (seperti misalnyadnsmasq
) dan berikan dengan konfigurasi yang sesuai. Itu melampaui lingkup pertanyaan ini.Pilihan lain - jika Anda hanya perlu terhubung secara interaktif - adalah menggunakan perintah yang akan memindai
~/.ssh/config
. Itu akan menghemat beberapa pengetikan (terutama jika Anda memilikiHost
entri yang cukup beragam ). Sesuatu seperti ini (untukbash
inisialisasi):Fungsi pertama membuat daftar dari mana host selesai (biasanya itu cukup untuk menjalankan ini sekali dalam setiap shell), yang kedua melakukan penyelesaian yang sebenarnya, meskipun dengan sedikit canggung - hanya melengkapi nama host ketika itu token terakhir pada baris perintah.
Semua ini mengatakan, cara yang tepat untuk mendekati masalah ini adalah menghubungkan ke jaringan kerja melalui VPN dan dengan demikian memiliki alamat IP pekerjaan lokal yang dapat diakses seolah-olah Anda berada di kantor. Anda kemudian dapat keras-kawat alamat menjadi apa pun lapisan mana yang Anda inginkan:
~/.ssh/config
,/etc/resolv.conf
atau (imho pilihan terbaik) nama kantor Server.sumber
gamma
agar sesuai dengan port jarak jauh jika itu akan membuat segalanya lebih mudah.Beberapa tahun yang lalu, saya menulis sebuah program untuk tujuan yang sama. Mungkin sesuai dengan kebutuhan Anda. Dengan program itu konfigurasi ssh dapat terlihat seperti ini:
sumber
Namun solusi lain adalah dengan menggunakan dua file konfigurasi yang berbeda untuk SSH. Anda mungkin menganggap ini sedikit kurang elegan daripada memiliki segalanya dalam satu file konfigurasi, tetapi lebih mudah untuk mempertahankannya.
Anda memilih file konfigurasi yang ingin Anda gunakan
-F <configfile>
.sumber
-F
opsinya.Sebagian jawaban:
Banyak jawaban di atas dimulai dengan "jika Anda dapat mendeteksi di jaringan mana Anda berada". Untuk ini saya menggunakan skrip yang berjalan ketika antarmuka terhubung untuk memulai berbagai hal (VPN, biasanya) ketika saya terhubung ke salah satu jaringan saya yang biasa. Tekniknya adalah menggunakan ARP untuk mendapatkan alamat MAC gateway:
Dan kemudian saya memiliki tabel pencarian untuk menghubungkan jaringan ke gateway MAC. Tentu saja tabel itu dapat menampung beberapa MAC untuk jaringan yang sama (kasing tipikal adalah berbagai hotspot Wifi di situs perusahaan besar). Tabel pencarian lain digunakan untuk menentukan skrip yang akan dijalankan untuk jaringan itu.
Dalam kasus saya, skrip dijalankan menggunakan notifikasi desktop Plasma, jadi semuanya ada di userland.
sumber