【问题标题】:Expect Script - Auto Password期望脚本 - 自动密码
【发布时间】:2015-11-28 23:59:27
【问题描述】:

我正在尝试制作一个脚本,它会自动输入密码“root”以将 ssh-key 从 A 复制到 B。由于 ssh-copy 在 B 上不起作用并且也无法安装,所以我使用了:

ssh root@$ip mkdir -p .ssh
cat "~/.ssh/id_rsa.pub" | ssh "root@$ip" 'cat >> .ssh/authorized_keys'

转移密钥。但是 B 会在重新启动时删除其存储。所以我必须自动化这个过程。我认为期望脚本是最简单的解决方案?然而,我对这些不是很有经验。

#!/usr/bin/expect
#31.09.2015

set timeout 30

spawn ssh "root@$ip mkdir -p .ssh"
expect "password:"
send "root\r"
expect "(yes/no)? "
send "yes\r"

spawn cat "~/.ssh/id_rsa.pub" | ssh "root@$ip" 'cat >> .ssh/authorized_keys'
expect "password:"
send "root\r"

interact

它似乎在第一次发送之前有效。然后卡住并等待输入? (错误的期望?)

【问题讨论】:

  • “但是 B 在重启时删除了它的存储”,这是预期的行为吗?
  • 另一种选择是使用 ssh 密钥,而不是将密码写入脚本。

标签: linux send expect ssh-keys raspberry-pi2


【解决方案1】:

这是您遇到问题的部分:

spawn ssh "root@$ip mkdir -p .ssh"
expect "password:"
send "root\r"
expect "(yes/no)? "
send "yes\r"

发送密码后,您将等待 30 秒以等待 (yes/no? 出现,但如果您之前已连接到该计算机,则它可能不会出现。您希望有条件地期待 y/n 提示:

spawn ssh "root@$ip mkdir -p .ssh"
expect {
    "(yes/no)? " { send "yes\r"; exp_continue }
    "password:"  { send "root\r" }
}
expect eof

expect 命令的这种形式允许您同时查找多个字符串。如果看到的第一个是“(是/否)?”,则发送“是”并继续执行此期望命令。当您看到“密码:”时,发送密码并让期望命令结束。

您可能想要更改第二个 spawn 命令 所以shell可以处理管道。

set cmd [format {cat "~/.ssh/id_rsa.pub" | ssh "root@%s" 'cat >> .ssh/authorized_keys'} $ip]
spawn sh -c $cmd

【讨论】:

    【解决方案2】:

    spawn 不会按照您希望的方式处理输入重定向。 最简单的解决方案是创建一个单独的 shell 脚本来进行复制,让expect 只处理密码提示。

    这对我有用:

    cat copykey.sh:

    #!/bin/bash
    ssh user@host "cat >> .ssh/authorized_keys" < ~/.ssh/id_rsa.pub
    

    cat copykey.expect:

    #!/usr/bin/expect -f
    set timeout 30
    
    spawn ssh user@host mkdir -p .ssh
    expect "password:"
    send "password\n"
    expect "$ "
    
    spawn ~/copykey.sh 
    expect "password:"
    send "password\n"
    expect "$ "
    

    【讨论】:

    • 使用了你的脚本->spawn id exp6 not opens
    • 确保远程端不存在~/.ssh
    • @TheCheatsrichter:这解决了你的问题吗?如果没有,解决方法是什么?如果你找到了?
    【解决方案3】:

    需要给出ip、用户名、密码作为命令行参数(Remotelogin.exp)

        #!/usr/bin/expect
        set ip [lindex $argv 0]
        set user [lindex $argv 1]
        set password [lindex $argv 2]
        spawn ssh $user@$ip
        expect {
        "(yes/no)?" {
    
                      send "yes\r"
    
                      expect "password:"
    
                      send "$password\r"
    
                    }
    
        "password:" {
                       send "$password\r"
                    }
               }
    

    `

    示例:./Remotelogin.exp

    【讨论】:

      猜你喜欢
      • 2017-06-20
      • 1970-01-01
      • 2019-09-04
      • 2015-12-20
      • 2018-07-05
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 2021-07-12
      相关资源
      最近更新 更多