1

我想自动化 ssh 登录。经过一些研究,似乎 tcl/expect 是要走的路。

但是,我的问题是,当交互接管我的终端时,东西不能按预期工作(双关语不是故意的)。

例如,如果我调整终端的大小,它不会“占用”。此外,有时交互没有响应,有时它只是无缘无故挂起。我在下面包含了我的代码。我对代码的问题是,我错过了什么吗?

另外,有没有更好的方法来做到这一点(使用另一种脚本语言?)我需要终端非常敏感,这与我在控制台上手动键入 ssh 没有什么不同。

proc Login {username server password} {
    set prompt "(%|>|\#|\\\$) $"

    spawn /usr/bin/ssh $username@$server
    expect { 
        -re "Are you sure you want to continue connecting (yes/no)?" {
            exp_send "yes\r"
            exp_continue 
            #continue to match statements within this expect {}
        }

        -nocase "password: " { 
            exp_send "$password\r" 
            interact
        }
    }
}
4

3 回答 3

5

您提出的关于“交互”的问题没有注意到窗口已更改大小,因为默认情况下,交互仅监视字符流。当您调整窗口大小时,会发出 WINCH 信号。默认情况下,Expect 有,呃,默认操作就是忽略它。您应该使用 Expect 的 trap 命令来捕获 SIGWINCH。然后你可以做你想做的事——例如,将新尺寸传播到另一边或采取其他一些本地行动。

您可以在 Expect 的示例脚本中找到执行此操作的示例。并且在Expect 书中有关于如何处理SIGWINCH 的解释和示例。

于 2010-08-27T20:40:04.387 回答
0

正如 W. Craig Trader 在评论中提到的,“正确”的做法是使用 ssh-keygen 生成用于身份验证的密钥。

您可以通过设置来避免“继续”提示-o StrictHostKeyChecking=no

于 2010-07-22T00:04:28.273 回答
0
spawn ssh my-server.example.net
trap {
    set rows [stty rows]
    set cols [stty columns]
    stty rows $rows columns $cols < $spawn_out(slave,name)
} WINCH
expect {
    "assword: " {send "Let-Me-In-Please\r"}
    "Last login"
}
interact
于 2019-09-03T10:33:05.350 回答