Bash
從函式建構別名
我需要很多不同的別名來創建到不同伺服器的 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'
我想出了我在別名中添加的這個函式:
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 }
所以我只需要這樣做來隧道到我想要的伺服器:
tunnel abc@domain.com 8080 9000 7200
它運作良好,但如果可能的話,我不想使用 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" }
或者,對於
/bin/sh
:tunnel () { host="$1"; shift for port do set -- "$@" -N -L "$port:localhost:$port" shift done autossh -M 20000 "$@" "$host" }
這兩個函式都將第一個參數提取到變數
host
中,然後建構一個由提供的埠號組成的字元串組成的列表。
autossh
最後,兩個函式都使用給定的列表和主機呼叫。