私は、さまざまな物理的な場所(したがってさまざまな物理的なマシン)から、常に多くのマシンに接続しています。これのほとんどはsshを介して実行され、ゲートウェイマシンが必要になる場合があります(これは~/.ssh/config
のProxyCommand
を介して呼び出します)。リモートエンドで初期接続を呼び出すマシン(つまり、作業中のマシン)のIPまたはホスト名を識別する方法があるかどうか知りたいですか?
PermitUserEnvironment
を設定するためのルートがないマシンがあるため、環境変数を送信したくありません。$SSH_CLIENT
環境変数は直接接続に役立ちますが、最新のゲートウェイのみをリストします。解決策についての私の現在の考えは、$SSH_CLIENT
を取得し、それにsshで接続し、そのマシンの$SSH_CLIENT
値を見つけて、存在しなくなるまで繰り返すことです。次に、ホスト名を取得して、なんらかの方法でプルバックします。
しかし、ちょっとしたハックの仕事のようです。誰かがより良い方法を持っていますか?
私は主にbashシェルで作業していますが、それを使用しない提案も喜んでいます。
私は試したことがありませんが、うまくいくかもしれない何かを考えることができます: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
オプションについてはよくわかりません。多分あなたはそれらを省略する必要があります。
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
リモートエンドでwho -m
と入力すると、現在ログインしているユーザーに関する情報(ホスト名を含む)を取得できます。 who
はログインしたユーザーに関する情報を提供し、-m
スイッチは「stdinに関連付けられたホスト名とユーザーのみ」を表示します。
あなたは以下を試しましたか?
netstat -an | grep " 22 "