나는 집에 컴퓨터를 가지고 있습니다.프랭클린(제가 그렇게 부르거든요) 저는 업무용 노트북에서 SSH를 자주 사용합니다. 집에 있을 때는 Franklin.local로 SSH를 통해 접속하고, 직장이나 다른 곳에 있을 때는 Remote.address.of.franklin으로 SSH를 통해 접속합니다.
상황에 따라 항상 올바른 방식으로 연결되는 기능이 내 프로필에 있었으면 좋겠습니다. 내 네트워크 상태는 자주 변경됩니다(유선 vs. 무선, 다양한 SSID 등). 따라서 네트워크 상태를 감지하여 이 작업을 수행하고 싶지 않고 대신 다음을 수행합니다.
- 프랭클린을 로컬에서 사용할 수 있는 경우 로컬로 연결하세요.
- 그렇지 않으면 원격 연결
이것이 내가 지금 사용하고 있는 것입니다:
function franklin () {
ping -c 5 "franklin.local" > /dev/null
if [[ $? != 0 ]]
then
echo "franklin not available on local, so trying remote connection"
ssh -p 22 remote.address.of.franklin
else
echo "franklin available on local network, so trying local connection"
ssh [email protected]
fi
}
문제는 핑에 시간이 걸린다는 것입니다.내 질문은 다음과 같습니다두 개의 SSH 명령을 동시에 실행한 다음 자동으로 첫 번째 연결된 명령을 사용할 수 있습니까?
답변1
OR
쉘에서 간단한 것을 시도해 보는 것은 어떻습니까?
ssh [email protected] || ssh -p 22 remote.address.of.franklin
저는 ZSH에 대해 잘 알지 못하지만 평가 논리가 여전히 게으른 것 같습니다. 즉, 두 번째 부분은 첫 번째 부분이 실패한 경우에만 평가된다는 의미입니다. 물론, 첫 번째 명령이 franklin.local
사용 가능한지 확인하기 위해 잠시 동안 대기할 수도 있습니다 .
함수에 대해 했던 것처럼 명령을 별칭에 할당하여 단축할 수 있습니다.
답변2
나는 사용한다nc
핑을 보내는 대신:
franklin() {
local host=franklin.local
if nc -w1 $host 22 &>/dev/null; then
echo "connecting locally"
else
echo "connecting remotely"
host=remote.address.of.franklin
fi
ssh username@$host "$@"
}
"$@"
SSH 호출에 추가했습니다 . 이를 통해 다음과 같은 원격 명령을 빠르게 실행할 수 있습니다.
franklin uptime
답변3
알고 보니 생각보다 해결책에 더 가까웠어요. 핑의 주소 조회 부분이 어떻게 작동하는지에 대해 잘못된 가정을 갖고 있었습니다. 네트워크에 문제가 있고 Franklin.local이 핑을 반환하지 않으면 실패하고 원격으로 연결되는 것 같습니다. Franklin.local이 네트워크에 있으면 ping -c 1 franklin.local
0을 반환하고 그렇지 않으면 68을 즉시 반환합니다. 따라서 유일한 변경 사항은 핑 수가 5에서 1로 변경된다는 것입니다(더 이해하기 쉽게 스크립트 순서도 조정했습니다).
function franklin
{
ping -c 1 franklin.local &> /dev/null
if [[ $? == 0 ]]; then
echo "Connecting locally."
ssh "[email protected]"
else
echo "Connecting remotely."
ssh "remote.address.of.franklin"
fi
}
이는 이전에 수행했던 것보다 훨씬 빠르며 적절한 ssh 명령을 직접 사용하는 것보다 훨씬 느리지 않습니다.