我需要很多不同的别名来创建到不同服务器的 ssh 隧道。给你一些:
alias tunnel_1='autossh -M 20000 -N -L 8080:localhost:8080 -N -L 9200:localhost:9200 -N -L 8090:localhost:8090 user@server1.xx'
alias tunnel_2='autossh -M 20000 -N -L 8000:localhost:8080 -N -L 9200:localhost:9200 -N -L 8090:localhost:8090 user@server2.xx'
Run Code Online (Sandbox Code Playgroud)
我想出了在别名中添加的这个函数?:
addPort () {
echo "-N -L $1:localhost:$1 "
}
tunnel () {
aliasString="autossh -M 20000 "
for port in "${@:2}"
do
aliasString+=$(addPort $port)
done
aliasString+="$1"
eval $aliasString
}
Run Code Online (Sandbox Code Playgroud)
所以我只需要这样做来隧道到我想要的服务器:
tunnel abc@domain.com 8080 9000 7200
Run Code Online (Sandbox Code Playgroud)
它运行良好,但如果可能,我不想使用 eval。是否有另一种方法可以autossh
直接调用并在不使用 eval 的情况下为其提供正确的参数?
使用单个 shell 函数:
tunnel () {
local host="$1"; shift
local port
local args
args=( -M 20000 )
for port do
args+=( -N -L "$port:localhost:$port" )
done
autossh "${args[@]}" "$host"
}
Run Code Online (Sandbox Code Playgroud)
或者,对于/bin/sh
:
tunnel () {
host="$1"; shift
for port do
set -- "$@" -N -L "$port:localhost:$port"
shift
done
autossh -M 20000 "$@" "$host"
}
Run Code Online (Sandbox Code Playgroud)
这两个函数都将第一个参数提取到变量中host
,然后构建一个由提供的端口号组成的字符串组成的列表。
最后,这两个函数都autossh
使用给定的列表和主机进行调用。