Bash

從函式建構別名

  • September 10, 2019

我需要很多不同的別名來創建到不同伺服器的 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最後,兩個函式都使用給定的列表和主機呼叫。

引用自:https://unix.stackexchange.com/questions/540018