
다른 서버에 대한 SSH 터널을 생성하려면 다양한 별칭이 필요합니다. 그 중 일부를 알려주세요:
alias tunnel_1='autossh -M 20000 -N -L 8080:localhost:8080 -N -L 9200:localhost:9200 -N -L 8090:localhost:8090 [email protected]'
alias tunnel_2='autossh -M 20000 -N -L 8000:localhost:8080 -N -L 9200:localhost:9200 -N -L 8090:localhost:8090 [email protected]'
별칭에 이 함수를 추가했습니다.
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 [email protected] 8080 9000 7200
잘 작동하지만 가능하면 eval을 사용하고 싶지 않습니다. autossh
eval을 사용하지 않고 직접 호출하고 올바른 매개변수를 제공하는 또 다른 방법이 있습니까 ?
답변1
단일 쉘 기능을 사용하십시오.
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
주어진 목록과 호스트를 사용하여 호출됩니다.
답변2
aliasString
공백을 제외한 쉘 특수 문자를 포함하지 않습니다. 그러므로 eval $aliasString
, eval "$aliasString"
및 $aliasString
모두 동일합니다. 이것따옴표 없이 변수 대체 aliasString
와일드카드가 없으므로 단어 분리 및 와일드카드 확장을 수행합니다. 이는 단지 단어 분리입니다. eval "$aliasString"
모든 쉘 구문 분석 및 평가 단계가 수행됩니다. 공백을 제외한 특수 문자가 없으므로 토큰화만 수행됩니다. eval $aliasString
따옴표가 없는 변수 대체에서 단어 분할을 수행한 다음 단어를 함께 연결하고 사이에 공백을 추가한 다음 전체 쉘 평가를 수행하여 단어를 다시 분할합니다.
이것은 이 함수를 일반 sh로 작성하는 더 쉬운 방법입니다.
tunnel () {
command=$1
shift
for port do
command="-N -L "$port:localhost:$port $command"
done
autossh -M 20000 $command
}
이는 공백 와일드카드가 포함되지 않은 매개변수에 대해서만 작동합니다. 바라보다코살로난다의 답변보다 강력한 접근 방식을 위해.
관련된 쉘 별칭은 전혀 없습니다.