期望从jenkins执行时,实用程序不起作用

时间:2013-06-04 09:33:22

标签: linux jenkins hudson solaris expect

我们有一个unix脚本,它使用expect实用程序进行交互式执行。当我们从unix服务器运行时,此脚本运行良好。

如果我们从Jenkins运行此脚本,则无效。

以下是脚本

var="xxxxx"
expect -c "
    spawn sudo cp /abcd/sjws/config/obj.conf /abcd/sjws/config/obj.conf_jenkins
    expect {
    "Password:" { send $var\r;interact }
    }
    exit
    "

以下是我们从jenkins

运行时的输出
spawn sudo cp /abcd/sjws/config/obj.conf /abcd/sjws/config/obj.conf_jenkins 
Password: 
Password:
Build step 'Execute shell' marked build as failure 
Finished: FAILURE

5 个答案:

答案 0 :(得分:9)

由于Jenkins没有从实际终端运行它,interact无法正常工作,因为那里实际上无法进行任何用户交互。

您可以将interact替换为

expect eof
wait

答案 1 :(得分:1)

请使用var ='xxxxx'而不是var =“xxxxx”。希望这有帮助。

答案 2 :(得分:0)

似乎Jenkins不支持交互式命令模型。

尝试使用 sshpass 工具以非交互方式传递密码。

install sshpass

$ sshpass -p "password" {your command}

答案 3 :(得分:0)

这个问题非常类似于:Jenkins not waiting on call to a bash script with expect;对于那些遇到类似问题的人,特别是,当使用“ su ”实用程序更改用户时,请注意Jenkins会在用户更改后立即关闭SSH连接。您无法继续向新用户发出命令。以直接发送命令的方式设计脚本,例如:

spawn su - username -c "yoursinglewordcommand"

然后像往常那样使用expect脚本的其余部分(我也使用了interact命令成功)。

答案 4 :(得分:0)

您可以使用ssh steps plugin。该插件将提供sshScript之类的步骤,该步骤在远程节点上执行给定的脚本(文件)并响应输出,sshCommand在远程节点上执行给定的命令并响应输出,以及sshPut,sshGet,sshRemove。

添加到您的Jenkinsfile中:

node {
   def remote = [:]
   remote.name = 'test'
   remote.host = 'test.domain.com'
   remote.user = 'root'
   remote.password = 'password'
   remote.allowAnyHosts = true
   stage('Remote SSH') {
      sshCommand remote: remote, command: "cp /abcd/sjws/config/obj.conf /abcd/sjws/config/obj.conf_jenkins"
  }
}