webdevqa.jp.net

SSH接続が開いているかどうかを確認するにはどうすればよいですか?

public.sigmadesigns.comサイトに接続しようとしています。実際、RSA公開鍵をサーバーに送信することにより、そのサーバーに対して許可されました。しかし、repoを実行しようとすると、次のようになります。

Getting manifest ...
   from [email protected]:mipsandroid/platform/manifest.git
ssh: connect to Host public.mipsandroid.com port 22: Connection refused
ssh: connect to Host public.mipsandroid.com port 22: Connection refused
fatal: The remote end hung up unexpectedly
fatal: cannot obtain manifest [email protected]:mipsandroid/platform/manifest.git

私は企業のプロキシネットワーク内にいるので、このIPへのアクセスが開いているかどうかを知りたいです。どうすればこれを確認できますか?

5
Sen

〜/ .bashrcおよび〜/ .zshrcの一部の関数の簡略版(完全にPOSIX互換で、シェルスクリプトの準備ができています):

# true if we have the given command(s)
we_have() { type "[email protected]" >/dev/null 2>&1; }

# Usage: probe SERVER PORT|SERVICE
# returns true when SERVER has PORT opened (and responds within one second)
if we_have nc
  then probe() { nc -zw1 "[email protected]" >/dev/null 2>&1; }
  else probe() { echo X |telnet -e X "[email protected]" >/dev/null 2>&1; }
fi

# Usage: poke SERVER [PORT|SERVICE]
# As probe.  Also: PORT defaults to 80 (http) and reports the result
poke() {
  local RETVAL STATUS
  probe "$1" "${2:-80}"
  RETVAL=$?
  if [ $RETVAL != 0 ]; then
    STATUS=" not"
  fi
  echo "could$STATUS connect to port ${2:-80} on Host '$1'"
  return $RETVAL
}

これは、ポート番号と、/etc/servicesでインデックス付けされたサービス名をサポートします。 (これをテストするように注意してください。サービス名が間違っているためにテストが失敗した場合は、わかりません。)

いくつかのテスト例:

$ poke localhost ssh
could connect to port ssh on Host 'localhost'
$ poke localhost 12345
could not connect to port 12345 on Host 'localhost'

戻り値だけでスクリプトを作成する場合は、probeを使用します。

if probe localhost ssh; then
  echo something contingent on hosting ssh goes here
fi

nmapバージョン5以降がインストールされている場合は、ncコマンドの代わりにncat --send-only --recv-only -w 334ms $1 $2を使用できます。これはより速く失敗します(私は334msに落ち着きました。ncは秒単位の解像度しか許可しないので、1秒待つのに行き詰まります)。


これは、ホストされているものを検証せず検証せず、ポートが開いていることのみを検証することに注意してください。 99%の場合、これで十分です。それ以上が必要な場合は、次のようなものを試してください。

nmap -sV -p ssh localhost |grep -qi 'open.*ssh.*ssh[^?]'

これにより、 nmap サーバーlocalhostのポートssh(22)をスキャンし、サービス/バージョン情報を判別するように指示されます。私のシステムでは、grepがないと、次のように報告されます。

Starting Nmap 6.40 ( http://nmap.org ) at 2014-02-14 17:01 PST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000048s latency).
Other addresses for localhost (not scanned): 127.0.0.1
PORT   STATE SERVICE VERSION
22/tcp open  ssh     OpenSSH 6.4p1 Debian 2 (protocol 2.0)
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel

Service detection performed. Please report any incorrect results at http://nmap.org/submit/ .
Nmap done: 1 IP address (1 Host up) scanned in 0.24 seconds

したがって、grepコマンドは、SSHの最初のインスタンス(/ etc/services内のマッピングを示すだけ)を通過して、「ssh」(大文字と小文字を区別しない)と一致する必要があるホスティングサーバーとバージョン情報を調べます。 -qフラグは単に出力を抑制するだけです(したがって、これはprobeを置き換えることができます)。 nmapがサービスが何であるかを理解できない場合、ssh?と表示されるため、grep正規表現はそれに一致することを回避します。

それらを組み合わせて高速にし、SSHが本当に提供されていることを確認しましょう。

# Usage: vet_ssh SERVER [PORT|SERVICE]
# True when SERVER has PORT (default=22) both opened and serving SSH
vet_ssh() {
  probe $1 ${2:-22} && nmap -sV -p ${2:-22} $1 |grep -qiE 'open.....*ssh[^?]'
}

これで、probe関数でpokeの代わりにvet_sshを使用できます。これは、元のpoke関数とほぼ同じ速度になります。ポートが開いていないときは同じ速度で、ポートが開いてSSHを提供しているときは少し遅くなり、開いて何かnmapを提供しているときはかなり遅くなります。すぐに(またはまったく)認識できません。ここでのgrep正規表現は、代替ポートに対応するためにわずかに異なります。


私があなたの質問を完全に誤解した場合...あなたがすでにこのサーバーに接続しているかどうかを知りたい場合は(あなたがcouldであるかどうかではなく)、netstat次のように:

# Usage: am_i_sshed_to SERVER [PORT|SERVICE]
# True when you have an established connection to SERVER on PORT (default=22)
am_i_sshed_to() {
  local IP_QUERY=`Host "$1" |awk -v port="${2:-22}" '
    $2 != "mail" { printf "-e %s:%s ", $NF, port }
  '`
  netstat -tn |grep -w $IP_QUERY |grep -wq ESTABLISHED
}

次に、probeまたはam_i_sshed_toと同じ方法でvet_sshを使用できます。

(説明:netstatは、各アドレスを検索するのに非常に長い時間がかかります。チェックする1つのサーバーを1回検索するだけなので、最初の行にキャッシュします。awkコマンドは、メール配信について説明していない行はIPで終了する必要があることを示します($NF)。次のnetstat呼び出しのgrepクエリを作成すると、1.2.3.4はたとえば-e 1.2.3.4:22になります。複数のIP(コマンドラインのサイズ制限に達する前に最大数百)次に、netstatを実行し、TCP接続のみを確認し、名前に何もマッピングしません。単語をgrepします(キャッシュされたクエリに対して「11.2.3.4:22」または「1.2.3.4:2234」)を一致させないでください(意図的に引用符がないことに注意してください。引用符は必要ありません。引数の構造が変更されます!)。接続がまだ確立されていることを確認してください。ここでも、grep -qには出力がないため、これはprobeのドロップイン置換ですが、pokeの代わりにはなりません)

2
Adam Katz

Sdf.orgに対してsshを実行するだけでテストできます。私はちょうどしました、そしてそれは認証を求めました。そうでない場合は、IT部門にポート22を開くように依頼する必要があります。

0
KCotreau