ssh_config에서 LocalForward 옵션을 매개변수화하는 방법은 무엇입니까?

ssh_config에서 LocalForward 옵션을 매개변수화하는 방법은 무엇입니까?

나는 완벽하게 유효한 ssh 명령으로 시작했습니다.

$ ssh -fNL 3306:localhost:3306 [email protected]

이 구성은 내가 원하는 부분적인 단순화를 제공합니다.

Host tunnel
    HostName database.example.com
    IdentityFile ~/.ssh/coolio.example.key
    LocalForward 3306 localhost:3306
    User coolio

다음 명령으로 연결할 수 있는데 훨씬 더 좋습니다.

$ ssh -f -N tunnel

이제 내 질문은 이 작업(또는 이와 유사한 작업)을 수행할 수 있도록 매개변수화하는 방법입니다.

$ ssh -f -N tunnel -p 3306

또는:

$ ssh -f -N tunnel -p 5678

그런데 위의 예에서는 의도적으로 두 곳에서 동일한 포트 번호를 사용했습니다. 이것이 바로 이 상황에서 나에게 필요한 것입니다. (단, 포트가 다를 경우 어떻게 매개변수화할 수 있는지도 알고 싶습니다.)

내가 지금까지 시도한 것 :

Host tunnel
    HostName database.example.com
    IdentityFile ~/.ssh/coolio.example.key
    LocalForward %p localhost:%p
    User coolio

오류가 발생합니다.

ssh/config 잘못된 전달 사양

인용하다:
http://nerderati.com/2011/03/simplify-your-life-with-an-ssh-config-file/

답변1

이것은 가장 우아한 방법은 아니지만 다음과 같이 합니다.

  • 원본 파일의 포트 사양을 고유한 패턴으로 바꿉니다. 예를 들어:

    LocalForward myport localhost:myport
    
  • ssh별칭에서 .bashrc:

    alias ssh='/path/to/ssh_wrapper.pl'
    
  • 파일에 쓰기 /path/to/ssh_wrapper.pl:

    #!/usr/bin/perl
    
    use strict;
    use warnings;
    my $cmdline = join ' ',@ARGV;
    if($cmdline =~ / -p\s*([0-9]+)\b/ and $cmdline=~ / -N/){
         my $port = $1;
         system("sed 's/myport/$port/g' /etc/ssh/ssh_config > /tmp/ssh_config");       
    }
    else{
         system("sed 's/LocalForward/#LocalForward/' /etc/ssh/ssh_config > /tmp/ssh_config");
    }
    $cmdline .= ' -F /tmp/ssh_config';
    my $pid = fork;
    $pid ? wait : exec("/usr/bin/ssh $cmdline");
    unlink '/tmp/ssh_config';
    

    기본적으로 이는 ssh명령줄을 구문 분석하고 숫자 포트 사양이 뒤따르는 옵션을 찾으면 -p각 항목을 명령줄에 지정한 숫자 포트 값으로 바꿔 새 옵션을 생성합니다 ssh_config. 그 후에는 명령줄을 사용하여 실제 시스템 호출을 수행합니다. 자체 구성 파일을 생성하는 경우 새로 생성된 구성 파일에서 읽을 수 있도록 명령줄에 옵션을 추가합니다. 마지막으로 상위 프로세스는 포크를 완료하고 임시 구성 파일을 삭제하도록 합니다./tmp/ssh_configmyportforkexecssh-Fsshwaitsshssh

부인 성명

이 코드는 테스트되지 않았습니다. 자신의 책임 하에 시도해 보십시오. 구성 파일을 백업하는 것부터 시작하세요!

편집하다

앞서 작성한 코드는 숫자 포트를 제공하지 않으면 "잘못된 포트 사양" 오류로 인해 중단되므로 필요하지 않은 경우를 대비하여 -p해당 섹션을 주석 처리하는 코드를 추가했습니다 . 또한 전달하지 않고(예: 비표준 포트를 사용하는 상자로) 포트를 지정하려고 할 수 있으므로 옵션이 LocalForward없는 한 구성 파일에서 대체가 발생하지 않는지 확인했습니다 .-N-pssh

답변2

이 문제를 해결하는 더 쉬운 방법은 .bashrc에 함수를 만드는 것이었습니다.

sshfw () {
    ssh -fNL "$1":localhost:"$1" "$2"
}

이제 난 할 수 있어

sshfw 8890 [email protected]

관련 정보