我正在尝试创建一个 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"