1

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
4

2 回答 2

0

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

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

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

例如 :

ssh -o PreferredAuthentications=publickey -o StrictHostKeyChecking=no

您可能希望通过 option 使用不同类型的身份验证PubkeyAuthentication

于 2013-08-14T11:48:51.453 回答
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在后台进程中使用过。

于 2013-08-14T12:23:02.843 回答