基于接口up连接到ssh服务器

基于接口up连接到ssh服务器

我正在尝试创建一个 bash 别名,根据接口的可用性通过 ssh 连接到服务器。如果第一个接口可用,则通过特定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命令的使用方式仅提供有关我们感兴趣的单个接口的信息。

如果您想使用它作为别名,我会建议使用 shell 函数。这使得正确引用变得更容易,这是您建议的代码中的问题之一。它还可以更轻松地获得正确的语法,因为我们可以使用具有适当缩进的多行来使代码可读。

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"

相关内容