![Bash/expect 脚本通过 ssh 和端口敲击登录。无法使用 SSH 密钥](https://linux22.com/image/1348104/Bash%2Fexpect%20%E8%84%9A%E6%9C%AC%E9%80%9A%E8%BF%87%20ssh%20%E5%92%8C%E7%AB%AF%E5%8F%A3%E6%95%B2%E5%87%BB%E7%99%BB%E5%BD%95%E3%80%82%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8%20SSH%20%E5%AF%86%E9%92%A5.png)
我的登录服务器位于防火墙后面,该防火墙使用端口敲击来允许进入。登录流程如下
- 输入端口敲击命令。这需要输入我的外部 IP。
- 出现提示时,输入我的端口敲击密码。
- 输入ssh命令
- 输入密码
我可能获得使用 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`