首页 > 解决方案 > 如何通过带有 concourse 的 ssh 向远程系统发送命令

问题描述

我需要在 Ubuntu 18.04 机器上启动一个带有大厅的 java rest 服务器。我公司使用的 concourse 版本是 5.5.11。服务器代码是用 Java 编写的,所以一个简单java -jar <uber.jar>的命令行就足够了(见下文)。在生产中,我不会有这种简单的奢侈,因此我的问题。

我有一个 scp 命令可以将 .jar 从大厅复制到目标 Ubuntu 机器:

scp -i /tmp/key.p8 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ./${NEW_DIR}/${ARTIFACT_NAME}.${ARTIFACT_FILE_TYPE} ${SRV_ACCOUNT_USER}@${JAVA_VM_HOST}:/var/www

请注意,我的私钥是通过 -i 传递的,我可以确认它正在工作。

我遵循了另一个似乎很有希望的 SO Q&A:Getting ssh to execute a command in the background on the target machine ,但是在尝试了建议的解决方案和其他答案的一些排列之后,我仍然没有启动我的休息服务.

我在我的大厅脚本中尝试了这行的一些排列:

ssh -f -i /tmp/pvt_key1.p8 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${SRV_ACCOUNT_USER}@${JAVA_VM_HOST} "bash -c 'nohup java -jar /var/www/${ARTIFACT_NAME}.${ARTIFACT_FILE_TYPE} -c \"/opt/testcerts/clientkeystore\" -w \"password\" > /dev/null 2>&1 &'"

我尝试过在 ssh 中使用和不使用 -f 和 -t 开关,使用和不使用文件流重定向,使用和不使用 nohup 和 Linux 背景 ('&') 命令以及各种转义引号的方法。

在 bash 提示符下,这一行成功启动了我的服务器。需要两个开关来指向证书并提供密码:

java -jar rest-service.jar -c "/opt/certificates/clientkeystore" -w "password"

我真的认为这在 Concourse 是可能的,但我被困在这一点上。

标签: concourseconcourse-pipeline

解决方案


经过大量尝试出现错误,似乎我需要这样做:

ssh -f -i /tmp/pvt_key1.p8 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null ${SRV_ACCOUNT_USER}@${JAVA_VM_HOST} "bash -c 'sudo java -jar /var/www/${ARTIFACT_NAME}.${ARTIFACT_FILE_TYPE} -c \"/path/to/my/certificate\" -w \"password\" > /var/www/log.txt 2>&1 &'"

关键是我错过了命令的“sudo”部分。使用 nohup 而不是放入 Linux bash 背景指示器 ('&') 似乎在管道中给了我一个错误。这对我有用,但欢迎其他人发布带有更好答案或方法的回复,这可能是更好的做法。


推荐阅读