Bagaimana cara mendeteksi ketika shell dimiliki oleh sesi SSH jarak jauh?

9

Pertanyaan saya mirip dengan yang ini , tetapi saya mencari sesuatu yang sedikit berbeda. Saya memiliki PC notebook yang saya gunakan untuk mengakses mesin Linux di jaringan dalam dua skenario berbeda:

  • Saya memiliki koneksi kabel langsung ke jaringan.

  • Saya memiliki koneksi tidak langsung ke jaringan. Ada mesin gateway di jaringan yang terpapar ke Internet, yang bisa saya gunakan untuk membangun terowongan SSH ke host di jaringan. Ini jelas koneksi yang jauh lebih lambat, latensi tinggi.

Direktori rumah saya dapat diakses jaringan dari semua mesin, sehingga mereka membagikan salinan saya .bashrc. Saya ingin menambahkan fungsionalitas untuk .bashrcmendeteksi yang mana dari dua skenario yang saya ikuti dan bertindak sesuai (secara teknis, akan ada tiga skenario, di mana yang ketiga adalah saya masuk ke mesin lokal saya, tetapi itu harus dengan mudah ditangani ). Saya ingin melakukan hal-hal seperti:

  • alias ssh ssh -X ketika saya di jaringan lokal, tetapi saya tidak ingin menggunakan penerusan X melalui Internet.

  • export EDITOR=gvimketika saya di jaringan lokal, tetapi export EDITOR=vimketika saya jauh.

Dan seterusnya. Berdasarkan jawaban sebelumnya, sepertinya saya harus dapat mencapai sesuatu seperti ini dengan memeriksa konten SSH_CLIENT(jika ada) dan melihat apakah alamat IP klien cocok dengan salah satu adapter jaringan pada mesin lokal saya. Saya pikir saya akan melihat apakah ada cara yang lebih licin atau lebih kuat untuk mencapai ini.

Jason R
sumber

Jawaban:

10

Untuk mendeteksi sesi SSH, gunakan $SSH_CLIENT.

Untuk membedakan antara sesi lokal dan remote, ada dua pendekatan yang mungkin: sisi klien atau sisi server. Di sisi server, bandingkan $SSH_CLIENTdengan alamat IP lokal atau tabel perutean; ini biasanya akan memberi tahu Anda apakah koneksi tersebut dari LAN. Di sisi klien, Anda mungkin ingin meletakkan ForwardX11pengaturan di ~/.ssh/config: mengaturnya yesuntuk host LAN dan nountuk host WAN. Ini berarti memiliki perbedaan ~/.ssh/configdi situs yang berbeda; itulah yang saya lakukan, dan saya menghasilkan skrip shell.

Jika penerusan X11 aktif untuk koneksi LAN dan nonaktif untuk koneksi WAN, maka Anda dapat mengatur editor favorit Anda untuk $DISPLAYdiperhitungkan.

Pengaturan sisi server biasanya akan masuk ke Anda .profile(atau .bash_profilejika shell login Anda bash dan Anda gunakan .bash_profile, atau .zprofilejika shell login Anda zsh).

case ${SSH_CLIENT%% *}//$(/sbin/ifconfig |
                          sed -n 's/^.* addr:\([0-9][0-9.]*\) .*/\1/p' |
                          tr '\n' /)/ in
  "") :;;# local session
  10.42.*/10.42.*) :;; # LAN session
  1.2.3.*/1.2.3.*) :;; # LAN session
  *) unset DISPLAY;; # WAN session
esac
export EDITOR=vim
if [ -n "$DISPLAY" ] && type gvim >/dev/null 2>/dev/null; then
  EDITOR=gvim
fi
export VISUAL="$EDITOR"
Gilles 'SANGAT berhenti menjadi jahat'
sumber
aktif untuk LAN dan mematikan untuk LAN? Yang kedua harus membaca WAN - tapi itu edit karakter tunggal ...
Nils