私は完全に有効な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
しかし、上記の例では、意図的に2つの場所で同じポート番号を使用しました。これがまさにこの状況で私に必要なものです。 (ただし、ポートが異なる場合、どのようにパラメータ化できるかを知りたいです。)
私が今まで試したこと:
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]