다른 물리적 위치 (따라서 다른 물리적 시스템)에서 여러 머신에 지속적으로 연결합니다. 이것의 대부분은 ssh를 통해 이루어지며 때로는 게이트웨이 시스템이 필요합니다 ( ProxyCommand
in in을 통해 호출 ~/.ssh/config
). 원격 끝에서 초기 연결을 호출하는 컴퓨터 (예 : 작업중 인 컴퓨터)의 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를 포함 하는 환경 변수를 제공합니다 (변경해야 할 수도 있습니다).
우리가 수행하는 트릭은 명령을 원격으로 이중 qoutes에 넣는 것 "
입니다. 큰 따옴표 (적어도 Bash)는 STRING이 SSH에 전달되기 전에 쉘이 스캔하고 적절한 경우 확장 / 교체를 수행한다는 것을 의미합니다. 이것은 쉘이`$ (ifconfig …) 부분을 현재 IP 주소로 평가하고 ssh에 로컬 IP 주소와 함께 환경 변수에 대한 정의를 포함하는 문자열을 전달한다는 것을 의미합니다.
원격 컴퓨터에 로그인하면 echo $DAT_ORIGIN_HOST
IP 주소를 인쇄해야합니다.
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 "