Bash,Expect:SSH无效后执行命令

时间:2018-04-25 11:50:17

标签: bash shell expect

我需要登录VM并在那里执行一些命令。我已经完成了与同一主题相关的所有问题,但没有找到任何有EXPECT的解决方案。我正在使用EXPECT,因为我需要在使用SSH时传递密码。

我得到"命令未找到错误"在手动执行我的脚本时,它运行正常。

#!/usr/bin/expect -f

set user [lindex $argv 0]
set to [lindex $argv 1]
set pass [lindex $argv 2]
set command [lindex $argv 3]
puts "$user, $to , $command and $pass ."
# connect via scp
spawn sudo ssh -t -t -v $user@$to << EOF
    ls
EOF

#######################
expect {
-re ".*es.*o.*" {
exp_send "yes\r"
exp_continue
}
-re ".*sword.*" {
exp_send $pass\n
}
}
interact

收到错误:

  

spawn sudo ssh -t -t -v username @ server_ip&lt;&lt; EOF   无效的命令名称&#34; ls&#34;       在执行&#34; ls&#34;       (文件&#34; ./ establishSSHConnection.sh&#34;第10行)

2 个答案:

答案 0 :(得分:1)

看起来您正试图在“此处”文档中向远程系统发送命令:

spawn sudo ssh -t -t -v $user@$to << EOF
    ls
EOF

相反,您应该使用'exp_send'在'interact'之前发送ls命令,即删除'here'文档:

spawn sudo ssh -t -t -v $user@$to

将ls命令放在最后:

expect {
    -re ".*es.*o.*" {
        exp_send "yes\r"
        exp_continue
    }
    -re ".*sword.*" {
        exp_send "$pass\r"
    }
}
exp_send "ls\r"
interact

编辑:

啊,我误解了。如果您只想运行该命令,那么您需要告诉另一端关闭连接:

expect {
    -re ".*es.*o.*" {
        exp_send "yes\r"
        exp_continue
    }
    -re ".*sword.*" {
        exp_send "$pass\r"
    }
}
exp_send "ls\r"
exp_send "exit\r"
expect {
    eof {puts "Connection closed"}
    timeout {puts "Connection timed out"}
}

答案 1 :(得分:1)

Expect(在Tcl上面构建)没有这里的文件。

如果要远程执行命令然后结束ssh会话,请执行

set command "ls -lrt"  ; # for example
spawn sudo ssh -t -t -v $user@$to $command
# ... log in logic
expect eof