Expect和Bash脚本

时间:2016-08-05 15:16:10

标签: linux bash shell except

我尝试用expect脚本尝试连接ssh,并查看是否可以(良好密码和可访问)。我试图将结果放入变量,但只记录了 stdout 的末尾,而不是所有 stdout 。我该怎么办?

result=$(
(/usr/bin/expect << EOF
    spawn ssh $username@$ip -o StrictHostKeyChecking=no
    set timeout 2
    expect ":"
    send -- "$password\r"
    expect ">"
    send -- "show clock\r"
    expect ">"
EOF
) 2>&1)

谢谢。

3 个答案:

答案 0 :(得分:3)

如果您尝试使用ssh自动将命令发送到其他服务器:

  • 生成ssh密钥,而不是使用密码:

    ssh-keygen -t rsa -b 2048
    
  • 将其复制到服务器:

    ssh-copy-id id@server
    

现在您无需担心密码。 ssh个密钥充当密码,通常很多更安全。有关ssh键的详细信息,请参阅这些(SSH login without passwordWhy is using SSH key more secure than using passwords?)。

然后您可以使用此命令 - 不需要expect,因为不会要求您输入密码。它将使用您的ssh密钥。我的位于~/.ssh/id_rsa。所以:

ssh id@server -i ~/.ssh/id_rsa "show clock;"
  • -i代表身份文件,即您的ssh密钥文件。

将向SSH服务器发送命令。

现在:

ssh-keygen -t rsa -b 2048
ssh-copy-id id@server
ssh id@server -i ~/.ssh/id_rsa "show clock;"

三个命令,你已经完成了!

答案 1 :(得分:0)

从shell脚本调用expectcript:

expect "/copySSHKey.exp <machine> <password> </.ssh/id_rsa.pub path>"

期待脚本:

#!/usr/bin/expect -f

set machine [lrange $argv 0 0]
set ip [lrange $argv 1 1]
set pass [lrange $argv 2 2]
set path [lrange $argv 3 3]

set timeout -1
spawn ssh-keygen -R ${machine}
spawn ssh-copy-id -i ${path} root@${machine}

match_max 100000

expect {

   sleep 10

   "password" {
            send -- "$pass\r"
            send -- "\r"
            sleep 1
            send_user " SSH key copied to $machine\n"
    }

    "$machine's" {
            send_user " SSH key copied to $machine\n"
    }

    "password:*" {
            send -- "$pass\r"
            send -- "\r"
            sleep 1
            send_user " SSH key copied to $machine\n"
    }

    "machine" {
            sleep 1
            send_user " SSH key copied to $machine\n"
    }
}

interact

答案 2 :(得分:-1)

尝试使用双引号(&#34;)来捕获子shell的输出。由于解析问题,您可能会丢失数据:

result="$( ... )"