web-dev-qa-db-ja.com

Originマシン(ssh)のIPまたはホスト名の検索

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

  • PermitUserEnvironmentを設定するためのルートがないマシンがあるため、環境変数を送信したくありません。
  • $SSH_CLIENT環境変数は直接接続に役立ちますが、最新のゲートウェイのみをリストします。

解決策についての私の現在の考えは、$SSH_CLIENTを取得し、それにsshで接続し、そのマシンの$SSH_CLIENT値を見つけて、存在しなくなるまで繰り返すことです。次に、ホスト名を取得して、なんらかの方法でプルバックします。

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

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

10
Geodesic

私は試したことがありませんが、うまくいくかもしれない何かを考えることができます: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が含まれています(変更する必要がある場合があります)。

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

リモートマシンにログインすると、echo $DAT_Origin_HostがIPアドレスを出力するはずです。

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

免責事項:-l-iおよび/bin/bashオプションについてはよくわかりません。多分あなたはそれらを省略する必要があります。

3
user1129682

proxycommandホップを使用して発信元マシンから宛先に直接接続していることを正しく理解しました。そして、ここにあなたのための3つのハックがあります(使用シナリオに関するコメントの後に3番目が追加されました)。まず、リモートポートフォワーディングを使用して、-R remotemachineport:dstonlocalnet:dstportonlocalnetを使用してOriginマシンに戻ることができるようにします。

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
2
Manwe

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

1
Paulo Almeida

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

 netstat -an | grep " 22 "
0
user218473