
완전히 작동하는 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_config
myport
fork
exec
ssh
-F
ssh
wait
ssh
ssh
부인 성명
이 코드는 테스트되지 않았습니다. 자신의 책임하에 시도해보십시오. 먼저 구성 파일을 백업하세요!
편집하다
이전에 작성된 코드는 숫자 포트를 제공하지 않으면 "잘못된 포트 사양" 오류로 인해 중단되므로 필요하지 않은 경우를 대비해 해당 부분을 -p
주석 처리하는 코드를 추가했습니다 . 또한 전달을 요구하지 않고(예: 비표준 포트를 사용하는 상자로) 포트를 지정하려고 할 수 있기 때문에 옵션이 LocalForward
없으면 구성 파일에서 대체가 발생하지 않는지 확인했습니다 .-N
-p
ssh
답변2
제가 이 문제를 해결한 더 간단한 방법은 .bashrc에 함수를 만드는 것이었습니다.
sshfw () {
ssh -fNL "$1":localhost:"$1" "$2"
}
이제 난 할 수 있어
sshfw 8890 [email protected]