Bash/expect 脚本通过 ssh 和端口敲击登录。无法使用 SSH 密钥

Bash/expect 脚本通过 ssh 和端口敲击登录。无法使用 SSH 密钥

我的登录服务器位于防火墙后面,该防火墙使用端口敲击来允许进入。登录流程如下

  1. 输入端口敲击命令。这需要输入我的外部 IP。
  2. 出现提示时,输入我的端口敲击密码。
  3. 输入ssh命令
  4. 输入密码

我可能获得使用 ssh 密钥的权限,但我正在尝试编写一个脚本,以便能够减少登录时间,因为我必须为要启动的每个 shell 都经历这个流程。

#!/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 命令时

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

但是将相同的命令复制/粘贴到命令行就可以正常工作。

答案1

@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

答案2

我没有经验expect,但我想知道理解反引号。尝试

#!/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"
!

这样你就得到了要由 shell 处理的。`curl http://ipecho.net/plain`

相关内容