it-swarm-ja.com

sshおよびポートノッキングを介してログインするためのBash / expectスクリプト。 SSHキーは使用できません

私のログインサーバーは、ポートノッキングを使用してエントリを許可するファイアウォールの背後にあります。ログインフローは

  1. ポートノッキングコマンドを入力します。これには、外部IPを入力する必要があります。
  2. プロンプトが表示されたら、ポートノッキングパスワードを入力します。
  3. Sshコマンドで入力します
  4. パスワードを入力してください

Sshキーの使用許可を得ることができますが、起動するシェルごとにこのフローを実行する必要があるため、ログイン時間を短縮できるスクリプトを作成しようとしています。

#!/bin/expect
spawn fwknop -A tcp/22 -a `curl http://ipecho.net/plain` -D foo.org -P tcp -p 9999
expect "Enter encryption password:"
send "pass1\r"

spawn ssh -Y [email protected]
expect "[email protected]'s password:"
send "pass2\r"

各コマンドの実行は、コマンドラインから正常に機能します。しかし、最初のスポーンコマンドを実行しようとすると

spawn fwknop -A tcp/22 -a `curl http://ipecho.net/plain` -D foo.org -P tcp -p 9999

エラーが発生します:

fwknop: fko_set_spa_message: Error 10 - Invalid allow IP address in the SPA message data
send: spawn id exp7 not open

ただし、同じコマンドをコマンドラインにコピーして貼り付けると、問題なく機能します。

2
Zach Melnick

@Scottは正しいです、expect/Tclはバックティックに対して特別なことは何もしません、それらは単なる文字です。ただし、これは機能するはずです。

#!/bin/expect
set ip [exec curl http://ipecho.net/plain]
spawn fwknop -A tcp/22 -a $ip -D foo.org -P tcp -p 9999
0
glenn jackman

expectの経験はありませんが、itがバックティックを理解しているかどうか疑問に思います。試してみてください

#!/bin/sh#または、必要と思われる場合は#!/usr/bin/env bashを指定します。
expect <<- !
    spawn fwknop -A tcp/22 -a `curl http://ipecho.net/plain` -D foo.org ...
    expect "Enter encryption password:"
    send "pass1\r"

    spawn ssh -Y [email protected]
    expect "[email protected]'s password:"
    send "pass2\r"
!

したがって、`curl http://ipecho.net/plain`をシェルで処理することができます。

0
Scott