我们有一个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
答案 0 :(得分:9)
由于Jenkins没有从实际终端运行它,interact
无法正常工作,因为那里实际上无法进行任何用户交互。
您可以将interact
替换为
expect eof
wait
答案 1 :(得分:1)
请使用var ='xxxxx'而不是var =“xxxxx”。希望这有帮助。
答案 2 :(得分:0)
似乎Jenkins不支持交互式命令模型。
尝试使用 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"
}
}