오리진 머신의 IP 또는 호스트 이름 찾기 (ssh)


10

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

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

해결책에 대한 나의 현재 생각은 그것을 잡고 $SSH_CLIENTssh하고, 기계의 $SSH_CLIENT가치를 찾아서 존재하지 않을 때까지 반복하는 것입니다. 그런 다음 호스트 이름을 잡고 어떻게 든 다시 가져옵니다.

그래도 약간의 해킹 작업처럼 보입니다. 누구든지 더 나은 방법이 있습니까?

나는 주로 bash 쉘에서 일하고 있지만 그것을 사용하지 않는 제안에도 행복하다.


ProxyCommand의 목적 중 하나는 물론 원래 호스트를 숨기거나 잊어 버리는 것입니다 (예 : 최종 호스트에서 라우팅 할 수 없음)
Hagen von Eitzen

이 정보가 필요한 장소 또는 이유를 예를 들어 주실 수 있습니까? 명백한 다른 해결책이있을 수 있습니다.
Manwe

@Manwe 궁극적으로 내 .bashrc와 같은 곳에 로케일 특정 섹션을 설정하고 싶습니다. 지금 내가하고 싶은 것은 내가 어떤 기계에서 일 하느냐에 따라 vim에서 자동으로 세 가지 키보드 레이아웃 중 하나를 설정 하는 것입니다.
측지선

답변:


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_HOSTeth0에 ip를 포함 하는 환경 변수를 제공합니다 (변경해야 할 수도 있습니다).

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

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

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

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


당신은 여기에 뭔가있을 수 있습니다! 나는 조금 가지고 놀아 다시 돌아올 것이다.
측지선

pseudo-tty 및 remote 명령이 모두 작동 하므로이 답변을 표시하고 있습니다. 원격 명령 제안을 기반으로 ^ E 콜백으로 특정 사례를 해결했습니다. 결국 약간 깨끗하고 일반적으로 사용되었습니다. 감사!
측지선

2

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

제안에 감사드립니다. 그러나 아직 완전히 만족하지 못했습니다. 원격 포트 포워드는 나쁜 생각은 아니지만 모든 호스트에서 동일한 사용자 이름을 사용한다고 가정합니다. 그것은 여기의 경우 나 내가 바꿀 수있는 것이 아닙니다. 둘째 : 나는 이것을 작동시키지 못했습니다. 당신은이 말하는 AcceptEnv LC_*되어 일반적으로 기본 설정에 의해, 표준을 허용,하지만?
측지선

LC_가 맞았습니다. 나는 그것이 얼마나 널리 퍼져 있는지에 대해서는 언급 할 수 없지만 작동 할 수있는 것입니다. ssh 연결 전에 LC_SOURCEHOST를 내보내는 것을 잊지 마십시오.
Manwe

LC_ *를 테스트했으며 작동합니다. 의 AcceptEnv지시문에 나열된 변수 일 수 있습니다 /etc/ssh/sshd_config. sshd이 파일이 변경되면 다시 시작 해야합니다.
david.perez

1

who -m원격 끝에 입력 하여 현재 로그인 한 사용자 (호스트 이름 포함)에 대한 정보를 얻을 수 있습니다 . who로그인 한 사용자에 대한 정보를 제공하고 -m스위치는 "stdin과 연관된 호스트 이름 및 사용자 만"을 표시합니다.


이것은 게이트웨이 컴퓨터를 통해 터널링하지 않는 경우에만 유용합니다.
측지선

0

다음을 시도 했습니까?

 netstat -an | grep " 22 "

이 방법은 하나의 홉 연결에만 유용하므로 나에게는 유용하지 않습니다.
측지선
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.