如何使用 concourse 通过 ssh 向远程系统发送命令

How do I send a command to a remote system via ssh with concourse

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

我有一个 scp 命令可以将 .jar 从 concourse 复制到目标 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 target machine , 但在尝试了建议的解决方案和其他答案的一些排列后,我仍然没有开始我的休息服务。

我已经在我的 concourse 脚本中尝试了这行的一些排列:

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 中完成,但我被困在了这一点上。

经过多次试错,看来我需要这样做:

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 背景指示器 ('&') 似乎在管道中给我一个错误。这对我有用,但欢迎其他人 post 提供更好的答案或方法,这可能是更好的做法。