7

我们有一个 unix 脚本,它使用期望实用程序进行交互式执行。当我们从 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
4

5 回答 5

11

由于 Jenkins 不是从实际终端运行它,interact因此不起作用,因为那里实际上不可能有任何用户交互。

您可以替换interact

expect eof
wait
于 2015-02-22T15:36:06.420 回答
1

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

于 2014-12-30T06:36:11.820 回答
0

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

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

安装 sshpass

$ sshpass -p "password" {your command}
于 2014-12-11T07:59:21.123 回答
0

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

spawn su - username -c "yoursinglewordcommand"

然后像往常一样使用期望脚本的其余部分(我也成功使用了交互命令)。

于 2016-10-17T13:23:01.743 回答
0

您可以使用ssh steps 插件。该插件将提供诸如在远程节点上执行给定脚本(文件)并以输出响应的 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"
  }
}
于 2018-07-22T17:05:46.913 回答