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

しかし、上記の例では、意図的に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_configmyportforkexecssh-Fsshwaitsshssh

婦人声明

このコードはテストされていません。自分の責任で試してください。設定ファイルのバックアップから始めましょう!

編集する

前述のコードは、数値ポートを指定しないと「無効なポート仕様」エラーによって中断されるため、不要な場合に備えてそのセクションを-pコメントアウトするコードを追加しました。また、転送しないで(たとえば、標準以外のポートを使用するボックスとして)ポートを指定しようとする可能性があるため、オプションがない限り、構成ファイルで置換がLocalForward発生しないことを確認しました。-N-pssh

答え2

この問題を解決するより簡単な方法は、.bashrcに関数を作成することでした。

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

今私はできます

sshfw 8890 [email protected]

関連情報