期待ssh不能每次都工作

时间:2013-08-14 10:18:23

标签: bash expect

我使用expect + ssh + bash executed command创建了脚本,以便在远程计算机上自动执行某些过程。

问题是它不是每次都有效。

  • 有时会挂在password:
  • 有时它会正常登录但不会execute remote command,只需在超时后退出。

这里bash是脚本:

#!/bin/bash

USER="user"
PASSWORD="password"
MACHINES="host1 host2 host3 host4"

ex() {

expect -c "
                log_file ${MACHINE}.log;#
                set timeout 8;
                spawn ssh $USER@$MACHINE
                expect -re \".*ssword: \" {send \"$PASSWORD\n\"}
                expect -re \".*host-.* \" { send \"sudo su -\r\"}
                expect -re \".*user: \" { send \"$PASSWORD\r\"}
                expect -re \".*# \" { send \"/usr/local/bin/REMOTE.COMMAND.sh\r\"}
                expect -re \".*# \" { send \"exit\r\"}
                expect -re \".*host-.* \" { send \"exit\r\"}


"

}

machines() {

for MACHINE in $MACHINES ; do

ex &
sleep 0.5

done
}


machines

以下是我的工作解决方案 - 如果有错误/效率不高的评论请:

#!/bin/bash

USER="user"
PASSWORD="password"
MACHINES="host1 host2 host3 host4"

ex() {

expect -c "
        log_file ${MACHINE}.log;#
        match_max 100000;
        set timeout 30;
        spawn ssh $USER@$MACHINE
        expect {
                -re \".*ssword: \" {send \"$PASSWORD\r\"; exp_continue }
                -re \".*user@host-.*\" { send \"sudo su -\r\"; exp_continue }
                -re \".*ssword.*:.*\" {send \"$PASSWORD\r\"; exp_continue }
                -re \".*host-.*# \" { send \"/usr/local/bin/REMOTE.COMMAND.sh\r\"; }
        }
        expect {
                -re \".*host-.*# \" { send \"exit\r\"; }
        }
        expect {
                -re \".*user@host-.*\" { send \"exit\r\"; }
        }

"

}

machines() {

for MACHINE in $MACHINES ; do

ex &
sleep 0.5

done
}

machines

2 个答案:

答案 0 :(得分:0)

我曾经遇到过类似的问题。

问题是由于我的SSH使用历史记录和我的~/.ssh/known_hosts数据。

您应该尝试向SSH命令添加选项,以便它始终与您已连接主机的行为相同。

例如:

ssh -o PreferredAuthentications=publickey -o StrictHostKeyChecking=no

您可能希望使用选项PubkeyAuthentication进行不同类型的身份验证。

答案 1 :(得分:0)

试试这个?:

expect -c "
    log_file ${MACHINE}.log;#
    set timeout 8;
    spawn ssh $USER@$MACHINE
    expect {
        -re \".*ssword: \" {send \"$PASSWORD\n\";exp_continue}
        -re \".*host-.* \" { send \"sudo su -\r\";exp_continue}
        -re \".*user: \" { send \"$PASSWORD\r\";exp_continue}
        -re \".*# \" { send \"/usr/local/bin/REMOTE.COMMAND.sh\r\";exp_continue}
        -re \".*# \" { send \"exit\r\"}
        -re \".*host-.* \" { send \"exit\r\"}
   }     
"

此外,我从未在后台进程中使用expect