오리진 머신의 IP 또는 호스트 이름 찾기 (ssh) 인 컴퓨터)의 IP 또는 호스트 이름을

다른 물리적 위치 (따라서 다른 물리적 시스템)에서 여러 머신에 지속적으로 연결합니다. 이것의 대부분은 ssh를 통해 이루어지며 때로는 게이트웨이 시스템이 필요합니다 ( ProxyCommandin in을 통해 호출 ~/.ssh/config). 원격 끝에서 초기 연결을 호출하는 컴퓨터 (예 : 작업중 인 컴퓨터)의 IP 또는 호스트 이름을 식별하는 방법이 있는지 알고 싶습니다.

  • 루트를 설정하지 않은 일부 컴퓨터로 환경 변수를 보내고 싶지 않습니다 PermitUserEnvironment.
  • $SSH_CLIENT환경 변수를 직접 연결하는 데 유용하지만, 가장 최근의 게이트웨이를 나열합니다.

해결책에 대한 나의 현재 생각은 그것을 잡고 $SSH_CLIENTssh하고, 기계의 $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_HOSTeth0에 ip를 포함 하는 환경 변수를 제공합니다 (변경해야 할 수도 있습니다).

우리가 수행하는 트릭은 명령을 원격으로 이중 qoutes에 넣는 것 "입니다. 큰 따옴표 (적어도 Bash)는 STRING이 SSH에 전달되기 전에 쉘이 스캔하고 적절한 경우 확장 / 교체를 수행한다는 것을 의미합니다. 이것은 쉘이`$ (ifconfig …) 부분을 현재 IP 주소로 평가하고 ssh에 로컬 IP 주소와 함께 환경 변수에 대한 정의를 포함하는 문자열을 전달한다는 것을 의미합니다.

원격 컴퓨터에 로그인하면 echo $DAT_ORIGIN_HOSTIP 주소를 인쇄해야합니다.

SSH I에 그 전화를 개발하기 위해 뻔뻔에서했다 IP 주소를 추출 여기여기에 -t과 어떻게 상호 작용 뭔가를 시작하려면

면책 조항 : -l-i옵션에 대해 잘 모르겠습니다 /bin/bash. 어쩌면 생략해야 할 수도 있습니다.


답변

ID가 proxycommand홉 을 사용하여 원래 컴퓨터에서 대상으로 직접 연결되어 있음을 올바르게 이해했습니다 . 그리고 여기에 세 가지 해킹이 있습니다 (세 번째는 사용 시나리오에 대한 의견 다음에 추가되었습니다). 먼저) 원격 포트 포워딩을 사용하여-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

셋째, ssh remote forward를 사용하여 호스트 또는 호스트 유형을 식별하십시오.

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


답변