2

ファイルに含まれているプロキシ情報を解析し、.ssh/configプロキシ情報と関連するプロキシ情報を持つ各ホストを表示したいと思います。プロキシ情報を持たないホストは除外す​​る必要があります。マニュアルページ.ssh/config: http: //man-wiki.net/index.php/5 :ssh_config

これは、BashのUnixシェルスクリプトから実行する必要があるため、Perl、awk、sedなどの標準ツールをお勧めします。

入力ファイルの例:

Host ssh.foo.com
    User ssh
    HostName ssh.foo.com
    Port 443
    ProxyCommand /usr/local/bin/corkscrew proxy 8080 %h %p ~/.ssh/proxyauth

Host ci
    HostName 127.0.0.2
    User ci

Host nightly
    HostName 192.168.1.1
    User goodnight

Host foobar.org
    User git
    HostName foobar.org
    Port 443
    ProxyCommand /usr/local/bin/corkscrew proxy 8080 %h %p ~/.ssh/proxyauth

Host integration
    HostName 192.168.1.2
    User int

期待される出力は次のようになります。

Host: ssh.foo.com - Proxy: /usr/local/bin/corkscrew proxy 8080 %h %p ~/.ssh/proxyauth
Host: foobar.org - Proxy: /usr/local/bin/corkscrew proxy 8080 %h %p ~/.ssh/proxyauth

ここでの難しさは、検索が複数の行をカバーしなければならないことです。

4

6 に答える 6

6

awk次のコマンドを試してください。

awk '
    $1 == "Host" { 
        host = $1 ": " $2; 
        next; 
    } 
    $1 == "ProxyCommand" { 
        $1 = ""; 
        sub( /^[[:space:]]*/, "" ); 
        printf "%s - Proxy: %s\n", host, $0;
    }
' .ssh/config

それは以下をもたらします:

Host: ssh.foo.com - Proxy: /usr/local/bin/corkscrew proxy 8080 %h %p ~/.ssh/proxyauth
Host: foobar.org - Proxy: /usr/local/bin/corkscrew proxy 8080 %h %p ~/.ssh/proxyauth
于 2012-10-08T09:54:46.123 に答える
2

awkワンライナーはあなたの要件のために働くかもしれません:

awk -v RS="" '/Proxy/{gsub(/\n/,"");gsub(/\s*User.*ProxyCommand/,"- Proxy:");print}'file

テスト(a.txtは入力ファイルです)

kent$  awk -v RS="" '/Proxy/{gsub(/\n/,"");gsub(/\s*User.*ProxyCommand/,"- Proxy:");print}' a.txt                                                                  
Host ssh.foo.com    - Proxy: /usr/local/bin/corkscrew proxy 8080 %h %p ~/.ssh/proxyauth
Host foobar.org    - Proxy: /usr/local/bin/corkscrew proxy 8080 %h %p ~/.ssh/proxyauth
于 2012-10-08T09:52:16.317 に答える
2

キックのためだけに、これを達成しているように見える厄介なsedコマンドがあります。

sed -n '/^[Hh]ost/{:r;h;:l;n;/^[Hh]ost/!{/[Pp]roxy/H;bl};/^[Hh]ost/{x;/[Pp]roxy/{s/\n\s*/ - /;s/[Cc]ommand/:/;s/[Hh]ost/\0:/;p};x;br}}' ~/.ssh/config

他のソリューションははるかに理解しやすいので、これはとにかくデモンストレーションの目的のためです。これについてのコメント付きの見解:

/^[Hh]ost/ {                # Begin on a Host line
    :restart                # Label to jump back to
    h                       # Copy the pattern space to the save space
    :loop                   # Label to jump to when we don't want to wipe out the save space
    n                       # Read in the next line
    /^[Hh]ost/!{            # For lines that aren't host definitions
        /[Pp]roxy/H         # If they are proxy configurations, append the line to the save space
        b loop              # Go to :loop
    }
    /^[Hh]ost/{             # If they are *not* host definitions
        x                   # Exchange the pattern and save spaces
        /[Pp]roxy/{         # If the new pattern space contains a proxy configuration
            s/\n\s*/ - /    # Insert the required separator
            s/[Cc]ommand/:/ # Change "ProxyCommand" to "Proxy:"
            s/[Hh]ost/\0:/  # Change "Host" to "Host:"
            p               # Print the pattern space
        }
        x                   # Exchange the pattern and save spaces
        b restart           # Go to :restart
    }
}

出力例:

Host: ssh.foo.com - Proxy: /usr/local/bin/corkscrew proxy 8080 %h %p ~/.ssh/proxyauth
Host: foobar.org - Proxy: /usr/local/bin/corkscrew proxy 8080 %h %p ~/.ssh/proxyauth
于 2012-10-08T10:59:42.600 に答える
1

Net :: SSH :: Perl :: Configモジュールをチェックアウトしましたか?sshキーワードのサブセットを使用しているにもかかわらず、標準形式で構成を読み取ると主張しています。

構成ファイルは、sshコマンドラインプログラムで使用されるものと同じ形式である必要があります。この形式の詳細については、sshのマンページを参照してください。Net :: SSH :: Perl :: Configは、これらのファイルに存在できる構成ディレクティブのサブセットを理解します。このサブセットは、Net :: SSH::Perlがサポートできる機能と一致します。不明なキーワードは単にスキップされます。

于 2012-10-08T09:49:19.473 に答える
1

使用する1つの方法GNU sed

sed -nre '/^Host/h;/ProxyCommand/{H;x;s/(Host)(.*)\n +[^ ]+ /\1:\2 - Proxy: /p}' file.txt

結果:

Host: ssh.foo.com - Proxy: /usr/local/bin/corkscrew proxy 8080 %h %p ~/.ssh/proxyauth
Host: foobar.org - Proxy: /usr/local/bin/corkscrew proxy 8080 %h %p ~/.ssh/proxyauth
于 2012-10-08T12:27:41.413 に答える
0

これを試して:

#! /usr/bin/perl
use strict;
use warnings;
open FD, "DATA" || die $!;
my $line = do {local $/; <FD>};
my @a = split /Host\b/, $line;
foreach (@a) {
    if (defined $_ and /^\s*(\S+).*ProxyCommand\s+([^\n]+)/s) {
        print "$1 - Proxy: $2\n";
    }   
}
于 2012-10-09T02:25:50.340 に答える