如何使用JFrog CLI将stdin内容通过跳板机上传至Artifactory?
你之前的方法失效的核心原因是JFrog CLI的
rt upload命令原生不支持从标准输入读取内容,也不识别-作为stdin占位符;命名管道失效是因为JFrog CLI上传前会尝试读取文件大小、计算哈希值,需要可随机访问的文件描述符,无法处理流式输入的管道。
可行解决方案
方案1:SSH端口转发本地直连上传(推荐)
不需要在跳板机写入任何数据,所有操作在本地完成,避免跳板机的资源限制:
- 本地启动SSH端口转发,将内网Artifactory的服务端口映射到本地:
# 请替换Artifactory的内网域名、端口和跳板机地址,-Nf参数让SSH后台静默运行 ssh -L 8082:artifactory.internal.domain:8082 jumpbox -Nf - 本地配置临时Artifactory实例指向本地转发端口:
jfrog config add temp-instance --url=http://localhost:8082/artifactory --user=<你的账号> --password=<你的密码> - 本地直接执行流式上传,如果你用的jfrog CLI版本支持stdin的话直接用
-即可,不支持的话可以用curl替代:# jfrog CLI方式(版本足够新可直接用) jfrog rt u - reponame/dir/myfile.tgz < myfile.tgz # curl替代方案,不需要依赖jfrog CLI,兼容性更好 cat myfile.tgz | curl -u <你的账号>:<你的密码> -T - http://localhost:8082/artifactory/reponame/dir/myfile.tgz - 上传完成后杀掉后台的SSH转发进程即可。
方案2:跳板机用curl直接流式上传
如果无法配置端口转发,可以直接在跳板机用curl完成上传,curl原生支持stdin读取,也能正确识别EOF,全程不写磁盘:
ssh jumpbox "curl -u <你的账号>:<你的密码> -T - http://artifactory.internal.domain/artifactory/reponame/dir/myfile.tgz" < myfile.tgz
方案3:内存临时文件适配jfrog CLI
如果必须使用jfrog CLI上传,可以利用Linux默认挂载的内存文件系统/dev/shm存储临时文件,不会占用磁盘空间:
ssh jumpbox "cat > /dev/shm/tmp_upload.tgz && jfrog rt u /dev/shm/tmp_upload.tgz reponame/dir/myfile.tgz && rm -f /dev/shm/tmp_upload.tgz" < myfile.tgz
注意该方案要求待上传文件大小小于跳板机的可用内存空间
内容的提问来源于stack exchange,提问作者Paul M
相关产品推荐
相关产品推荐

