함수에서 별칭 만들기

함수에서 별칭 만들기

다른 서버에 대한 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을 사용하고 싶지 않습니다. autossheval을 사용하지 않고 직접 호출하고 올바른 매개변수를 제공하는 또 다른 방법이 있습니까 ?

답변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
}

이는 공백 와일드카드가 포함되지 않은 매개변수에 대해서만 작동합니다. 바라보다코살로난다의 답변보다 강력한 접근 방식을 위해.

관련된 쉘 별칭은 전혀 없습니다.

관련 정보