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が見つかった場合、のすべての出現をコマンドラインで指定した数値ポート値に置き換えて、に新しい を作成します。その後、コマンドラインを使用して、実際の にシステム コールを実行します。独自の構成ファイルを作成した場合、は代わりに新しく作成された構成ファイルから読み取るように、コマンドラインにオプションを追加します。最後に、親プロセスはフォークが終了するのを待ち、その後、一時構成ファイルを削除します。-pssh_config/tmp/ssh_configmyportforkexecssh-Fsshwaitsshssh

免責事項

このコードはテストされていません。自己責任でお試しください。まず設定ファイルをバックアップしてください。

編集

以前に記述したコードは、数値ポートを指定しないと「ポート指定が正しくありません」というエラーで動作しなくなるため、不要な場合は-pその部分をコメントアウトするコードを追加しました。また、転送を必要とせずにポートを指定する場合(たとえば、非標準ポートを使用するボックスへの転送) もあるため、オプションがない限り、構成ファイルでの置換が行われないようにしました。LocalForward-N-pssh

答え2

もっと簡単な方法は、.bashrcに関数を作ることです。

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

今ならできる

sshfw 8890 [email protected]

関連情報