Menemukan IP atau nama host mesin asal (ssh)

10

Saya terhubung ke sejumlah mesin terus-menerus, dari lokasi fisik yang berbeda (dan dengan demikian mesin fisik yang berbeda). Sebagian besar ini dilakukan meskipun ssh, kadang-kadang mesin gateway atau dua diperlukan (yang aku memanggil via ProxyCommanddi ~/.ssh/config). Saya ingin tahu apakah ada metode untuk mengidentifikasi IP atau nama host dari mesin yang memanggil koneksi awal (yaitu mesin yang sedang saya kerjakan) di ujung jarak jauh?

  • Saya tidak ingin mengirim variabel lingkungan karena beberapa mesin saya tidak memiliki root untuk mengatur PermitUserEnvironment.
  • The $SSH_CLIENTvariabel lingkungan ini berguna untuk sambungan langsung, tetapi hanya berisi daftar gateway terbaru.

Ide saya saat ini untuk sebuah solusi adalah untuk meraih $SSH_CLIENT, ssh untuk itu, menemukan $SSH_CLIENTnilai mesin itu dan ulangi sampai tidak ada; kemudian ambil nama host dan tarik kembali entah bagaimana.

Sepertinya sedikit pekerjaan hack; apakah ada yang punya metode yang lebih baik?

Saya bekerja di bash shell kebanyakan, tapi saya juga senang atas saran yang tidak menggunakannya juga.

Geodesik
sumber
Salah satu tujuan ProxyCommand tentu saja untuk menyembunyikan (atau melupakan) host asal (yang misalnya tidak dapat dirutekan dari host terakhir)
Hagen von Eitzen
Bisakah Anda memberi contoh di mana atau mengapa Anda membutuhkan informasi ini? Mungkin ada solusi lain yang tidak jelas.
Manwe
@ Manwe Saya akhirnya ingin mengatur bagian spesifik lokal dalam hal-hal seperti .bashrc saya. Sekarang yang ingin saya lakukan adalah mengatur satu dari tiga tata letak keyboard secara otomatis dalam vim tergantung pada mesin apa yang saya gunakan .
Geodesic

Jawaban:

3

Saya belum pernah mencoba, tetapi saya bisa memikirkan sesuatu yang mungkin berhasil: Anda jangan biarkan SSH memulai shell login Anda, tetapi ambil masalah di tangan Anda sendiri. Anda dapat memberitahu SSH untuk menjalankan perintah sewenang-wenang. Dari pada

ssh remote_host

Anda akan menjalankan sesuatu di sepanjang baris

ssh remote_host -t "
    . /etc/profile; 
    . /etc/bash.bashrc; 
    DAT_ORIGIN_HOST=$(ifconfig eth0|grep -Po 't addr:\K[\d.]+') /bin/bash -l -i"

Apa yang dilakukan adalah, ini memberi SSH sesuatu yang lain untuk dilakukan alih-alih meluncurkan shell login. Sesuatu itu adalah string, yang akan dijalankan sebagai perintah, dari jarak jauh. Kami menggunakan ini untuk meluncurkan shell dengan cara yang sangat spesial: kami memberikannya variabel lingkungan DAT_ORIGIN_HOST, yang berisi ip kami pada eth0 (Anda mungkin perlu mengubahnya).

Trik yang kami lakukan adalah kami menempatkan perintah untuk menjalankan dari jarak jauh dalam qoutes ganda ". Kutipan ganda (setidaknya dalam Bash) berarti, SEBELUM STRING DILALU KE SSH, shell kami memindai dan melakukan ekspansi / penggantian, jika perlu. Ini berarti shell kami akan mengevaluasi bagian `$ (ifconfig ...), ke alamat ip kami saat ini dan meneruskan sebuah string yang berisi definisi untuk variabel lingkungan dengan alamat ip lokal kami.

Setelah masuk ke mesin jarak jauh, echo $DAT_ORIGIN_HOSTharus mencetak alamat IP Anda.

Untuk mengembangkan panggilan itu ke SSH, saya tanpa malu-malu mengambil dari sini untuk mengekstraksi alamat IP dan di sini untuk -t dan bagaimana meluncurkan sesuatu yang interaktif

Penafian: Saya tidak yakin tentang opsi -ldan -iuntuk /bin/bash. Mungkin Anda perlu menghilangkannya.

pengguna1129682
sumber
Anda mungkin tertarik pada sesuatu di sini! Saya akan bermain-main dengannya sebentar dan kembali kepada Anda.
Geodesic
Saya menandai jawaban ini, karena pseudo-tty dan perintah jarak jauh berfungsi. Saya akhirnya memecahkan kasus khusus saya dengan panggilan balik ^ E, berdasarkan saran perintah jarak jauh - akhirnya menjadi sedikit lebih bersih dan penggunaan umum. Terima kasih!
Geodesic
2

Id saya mengerti benar Anda koneksi langsung dari mesin asal ke tujuan dengan proxycommandhop. Dan inilah tiga retas untuk Anda (ketiga ditambahkan setelah komentar pada skenario penggunaan). Pertama) Gunakan penerusan port jarak jauh untuk memungkinkan Anda kembali ke mesin asal Anda-R remotemachineport:dstonlocalnet:dstportonlocalnet

ssh -R 2222:localhost:22 user@target
# on "target" you can now do this to get back to origin host
ssh user2@localhost -p 2222 

Kedua) Penyalahgunaan AcceptEnv LC_*target. Ini tidak baik tetapi cukup umum untuk mengizinkan variabel LOCALE bahkan ketika AcceptUserEnviconment tidak tersedia. Jadi sekarang Anda bisa melakukannya:

export LC_SOURCEHOST=my.ip.addr.or:something
ssh user@target
# on tathet:
echo $LC_SOURCEHOST

Ketiga) Gunakan ssh remote forward untuk mengidentifikasi tipe host atau host.

# Here is an example what you can use on target machine. 
# This will modify your PS1 variable (prompt) based on source host (port forwarding)
# Add this to .bash_profile

function checkHost {
  RET=""
  ## loop over test port numbers 17891-17895 in my example
  for x in $(seq 1 5); do 
    # if netstat is not available test port some other way like with nc or something
    ## && RET= will set RET = 1-5
    /bin/netstat -lnt|/bin/grep -q 127.0.0.1:1789$x && RET=$x;
  done
  # return RET
  # please note that if you have multiple open connections with different port numbers
  # this method cannot not distinguish between them 
  echo $RET
}

# get 1-5 number from function above
VAL=$(checkHost)
# do something like set PS1 var or map vim file or something
export PS1='\[\033k\033\\\]\u@\h: \w\$ '$VAL

Sekarang terhubung dengan port forwarding:

### this will still enable ssh forwarding back. Change 22 to something else like 
### 24 to disable it (if nothing is listening on your source machines 24 port)
ssh -R 17891:localhost:22 user@target
Manwe
sumber
Terima kasih atas sarannya, tetapi belum ada yang bekerja untuk kepuasan saya sepenuhnya. Remote port forward bukanlah ide yang buruk, tetapi asumsi yang diperlukan adalah Anda memiliki nama pengguna yang sama di semua host. Bukan itu yang terjadi di sini atau sesuatu yang bisa saya ubah. Kedua: Saya tidak bisa melakukan ini. Apakah Anda mengatakan bahwa AcceptEnv LC_*secara umum diizinkan, tetapi bukan standar, diaktifkan oleh pengaturan default?
Geodesic
Ya, LC_ terkena dan rindu. Saya tidak dapat mengomentari seberapa lazimnya hal itu, tetapi ini sesuatu yang mungkin bekerja .. (ingat untuk mengekspor LC_SOURCEHOST sebelum koneksi ssh).
Manwe
Diuji LC_ * dan berhasil. Itu bisa berupa variabel apa pun yang tercantum dalam AcceptEnvdirektif di /etc/ssh/sshd_config. Ingatlah untuk memulai kembali sshdjika file ini diubah.
david.perez
1

Anda dapat mengetik who -mdi ujung jarak jauh untuk mendapatkan informasi tentang pengguna yang saat ini masuk (termasuk nama host). whomemberi Anda informasi tentang pengguna yang masuk, dan -msakelar ini menunjukkan "hanya nama host dan pengguna yang terkait dengan stdin".

Paulo Almeida
sumber
Ini hanya berguna jika saya tidak melakukan tunneling melalui mesin gateway.
Geodesic
0

Apakah Anda mencoba yang berikut ini?

 netstat -an | grep " 22 "

sumber
Metode ini hanya berguna untuk koneksi satu hop, jadi tidak berguna untuk saya.
Geodesic