オリジンマシン(ssh)のIPまたはホスト名を見つける


10

私はさまざまな物理的な場所から(したがって、さまざまな物理的なマシンから)常に多数のマシンに接続しています。これのほとんどはsshを介しProxyCommandて行われ、ゲートウェイマシンが1つまたは2つ必要になる場合があります(これはで呼び出し~/.ssh/configます)。リモートエンドで初期接続を呼び出すマシン(つまり、作業中のマシン)のIPまたはホスト名を特定する方法があるかどうか知りたいのですが?

  • 設定するrootがないマシンがあるため、環境変数を送信したくありませんPermitUserEnvironment
  • $SSH_CLIENT環境変数は、直接接続するのに便利ですが、唯一の最も最近のゲートウェイを示しています。

私の現在の解決策のアイデアは、$SSH_CLIENTそれをsshで取得し、そのマシンの$SSH_CLIENT値を見つけて、それが存在しなくなるまで繰り返すことです。次に、ホスト名を取得して、なんとかして引き戻します。

少しハックの仕事のようですが。誰かがより良い方法を持っていますか?

私は主にbashシェルで作業していますが、それを使用しない提案についても満足しています。


もちろん、ProxyCommandの目的の1つは、元のホスト(たとえば、最終ホストからルーティングできない可能性がある)を非表示にする(または忘れる)ことです
Hagen von Eitzen '20

この情報が必要な場所や理由を教えてください。他の自明ではない解決策があるかもしれません。
Manwe 2013

@Manwe最終的には、.bashrcなどのロケール固有のセクションを設定したいと思います。今私がやりたいことは、作業しているマシンに応じて、vim で3つのキーボードレイアウトの 1つを自動的に設定することです。
測地線2013

回答:


3

私は試したことはありませんが、うまくいく可能性があることを考えることができます。SSHにログインシェルを開始させず、自分の手で問題を解決します。SSHに任意のコマンドを実行するように指示できます。の代わりに

ssh remote_host

あなたはの線に沿って何かを実行します

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

これは、ログインシェルを起動する代わりに、SSHに他の処理を提供します。これは文字列であり、コマンドとしてリモートで実行されます。これを使用して、非常に特殊な方法でシェルを起動しますDAT_ORIGIN_HOST。eth0のIPを含む環境変数をそれに与えます(変更する必要がある場合があります)。

私たちが実行するトリックは、リモートで実行するコマンドを二重qoutesに置くこと"です。二重引用符(少なくともBashでは)は、文字列がSSHに渡される前に、シェルがそれをスキャンし、必要に応じて拡張/置換を実行することを意味します。これは、シェルが `$(ifconfig ...)の部分を現在のIPアドレスに評価し、sshにローカルIPアドレスを含む環境変数の定義を含む文字列を渡すことを意味します。

リモートマシンにログインすると、echo $DAT_ORIGIN_HOSTIPアドレスが出力されます。

SSHへの呼び出しを開発するために、私はここからIPアドレスを抽出するためここから、そして-tのためにここから恥ずかしくなく、インタラクティブなものを起動する方法を取りまし

免責事項:-lとの-iオプションについては不明です/bin/bash。おそらく、それらを省略する必要があります。


あなたはここで何かをしているかもしれません!少し遊んで、また連絡します。
測地線2013

疑似ttyコマンドとリモートコマンドの両方が機能するため、この回答にマークを付けています。私は最終的に、リモートコマンドの提案に基づいて、^ Eコールバックを使用して特定のケースを解決しました-結局、少しクリーンで一般的な使用法になります。ありがとう!
測地線2013

2

Idは、あなたが起点マシンから宛先へproxycommandホップで直接接続していることを正しく理解しました。そしてここにあなたのための3つのハックがあります(使用シナリオに関するコメントの後に追加された3番目)。まず、リモートポート転送を使用して、元のマシンに戻ることができます-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 

第二に)AcceptEnv LC_*標的に対する虐待。良くありませんが、AcceptUserEnviconmentが使用できない場合でも、LOCALE変数を許可することはよくあります。だから今できること:

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

3番目に、sshリモート転送を使用して、ホストまたはホストタイプを識別します。

# 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

次に、ポート転送で接続します。

### 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

提案に感謝しますが、どちらもまだ満足のいくものではありません。リモートポートフォワードは悪い考えではありませんが、必要な前提は、すべてのホストで同じユーザー名を持っていることです。ここではそうではなく、私が変更できることもありません。次に、これを機能させることができませんでした。あなたはそれAcceptEnv LC_*がデフォルトの設定で一般的には許可されているが、標準は許可されていないと言っていますか?
測地線2013

まあLC_はヒットとミスです。それがいかに普及しているかについてコメントすることはできませんが、それはうまくいくかもしれません..(ssh接続の前にLC_SOURCEHOSTをエクスポートすることを忘れないでください)。
Manwe 2013

LC_ *をテストし、動作します。のAcceptEnvディレクティブにリストされている任意の変数を使用できます/etc/ssh/sshd_configsshdこのファイルが変更された場合は、必ず再起動してください。
david.perez 2017

1

次のように入力することができますwho -m(ホスト名を含む)現在ログインしているユーザーの情報を取得するためにリモートエンドに。whoログインしたユーザーに関する情報を提供し、-mスイッチは「stdinに関連付けられたホスト名とユーザーのみ」を表示します。


これは、ゲートウェイマシンをトンネリングしていない場合にのみ役立ちます。
測地線2013

0

あなたは以下を試しましたか?

 netstat -an | grep " 22 "

この方法は1ホップの接続でのみ有効であるため、私には役立ちません。
測地線2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.