인터페이스 업을 기반으로 SSH 서버에 연결

인터페이스 업을 기반으로 SSH 서버에 연결

인터페이스의 가용성에 따라 SSH를 통해 서버에 연결하기 위해 bash 별칭을 만들려고 합니다. 첫 번째 인터페이스를 사용할 수 있는 경우 해당 IP를 통해 연결하고, 그렇지 않은 경우 다른 특정 IP를 통해 연결합니다.

이것이 내가 생각해낸 것입니다:

alias server='if [ ip a | grep -Eq ': tun0:.*state UP' || up == up ] then ssh [email protected] else ssh [email protected]'

이 줄을 .bashrc에 넣었지만 새 터미널을 열 때 항상 다음 오류가 발생합니다.

bash: alias: tun0:.*state: not found
bash: alias: `UP || up ': invalid alias name

별칭 자체는 작동하지 않습니다. 별칭을 사용하려고 하면 다음과 같은 출력이 표시되기 때문입니다.

>

질문을 명확히 하기 위해: 가능한 경우 특정 IP 주소(192.168.1.130)를 사용하여 서버에 SSH로 연결하고 싶고, 그렇지 않으면 10.10.10.10을 사용하고 싶습니다. 그 반대의 경우도 마찬가지입니다. 왜냐하면 그것은 나에게 중요하지 않기 때문입니다.

답변1

tun0인터페이스가 작동 중인지 확인 ip하고 테스트 결과에 따라 IP 주소를 선택하는 데 사용합니다.

if ip address show tun0 | grep -q -F 'state UP'; then
    remote=10.10.10.10
else
    remote=192.168.1.130
fi

ssh root@"$remote"

여기서는 이것이 [ ... ]필요하지 않습니다. 대신 if명령문의 종료 상태를 사용 하도록 합니다 grep -q. 사용된 옵션은 grep출력이 없고 지정된 패턴이 정규식이 아닌 문자열로 사용되도록 보장합니다.

ip명령은 우리가 관심 있는 단일 인터페이스에 대한 정보만 제공하는 방식으로 사용됩니다.

별칭으로 사용하고 싶다면 쉘 함수를 사용하는 것이 좋습니다. 이렇게 하면 올바르게 인용하기가 더 쉬워지는데, 이는 제안한 코드의 문제 중 하나입니다. 또한 코드를 읽기 쉽게 만들기 위해 적절한 들여쓰기가 포함된 여러 줄을 사용할 수 있으므로 올바른 구문을 더 쉽게 얻을 수 있습니다.

server () {
    local remote

    if ip address show tun0 | grep -q -F 'state UP'; then
        remote=10.10.10.10
    else
        remote=192.168.1.130
    fi
    
    ssh root@"$remote"
}

답변2

별칭 정의 줄에 작은따옴표가 누락된 것 같습니다. 큰따옴표를 사용하여 별칭 명령을 정의해 보십시오. 상단에는 fi후행 및 선행 세미콜론이 누락되었습니다 then. 한 가지 더 주의할 점은 ip a ..."명령 대체"이므로 $(...).

답변3

파일에서 인터페이스 상태를 확인할 수 있습니다 /sys/class/net/$interface/operstate.

if [[ $(</sys/class/net/tun0/operstate) == up ]]
then
    ip=10.10.10.10
else
    ip=192.168.1.130
fi

답변4

내가 틀리지 않았다면 조건부 구문에 약간의 작업이 필요합니다

if [ condition ]; then <>;else <>? fi

뭔가를 함으로써 무엇을 성취하려고 합니까 up == up?

tun0UP할 때 연결하기 위해 이와 같은 별칭을 생각해 냈습니다.

alias server="if [ $(ip a | grep -Eq ': tun0:.*state UP') ]; then ssh [email protected]; else ssh [email protected];fi"

관련 정보