인터페이스의 가용성에 따라 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
?
tun0
UP할 때 연결하기 위해 이와 같은 별칭을 생각해 냈습니다.
alias server="if [ $(ip a | grep -Eq ': tun0:.*state UP') ]; then ssh [email protected]; else ssh [email protected];fi"