concourse - 如何通过带有 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 是可能的,但我被困在这一点上。
解决方案
经过大量尝试出现错误,似乎我需要这样做:
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 背景指示器 ('&') 似乎在管道中给了我一个错误。这对我有用,但欢迎其他人发布带有更好答案或方法的回复,这可能是更好的做法。
推荐阅读
- c++ - 如何将单例传递给qt中的另一个类
- excel - 使用两个 excel 列中的参数创建多个命名范围
- sql - 根据条件选择包含在 group by 子句中的列以外的列
- vba - 防止远程用户通过 VPN 打开数据库
- html - 下拉式菜单; hover css 不适用于兄弟成员,但适用于后代成员
- html - Django 控制台消息:GET /%7B HTTP/1.1
- sql - 将一个表中的值分配给另一个表
- python - 如何通过多个页面申请循环并将每个页面添加到 csv 文件
- c# - 允许依赖于 AttributeUsage 的 Attribute 构造函数
- python - 如何在不更改尺寸的情况下减小 PNG 图像的文件大小?