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]

관련 정보