
私は、この完全に機能する 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]