如何单命令实现从URL下载Shell脚本执行并传入管道数据
单条命令实现远程脚本下载、执行并传入管道输入
问题背景
- 现有一个支持读取管道传入数据的Shell脚本,本地执行方式如下:
$ echo "Test Data" | do-stuff.sh
- 脚本目前已迁移至远程地址
http://example.com/do-stuff.sh - 尝试使用以下命令实现远程执行时,管道传入的数据无法被目标脚本读取:
$ echo "Test Data" | ( curl -sfL http://example.com/do-stuff.sh | sh )
- 现有临时方案需要生成本地文件,流程如下,需要找到不落地本地文件的单行命令实现方案:
$ curl -sfL http://example.com/do-stuff.sh > do-stuff.sh $ chmod +x do-stuff.sh $ echo "Test Data" | do-stuff.sh $ rm do-stuff.sh
失效原因
之前的写法不生效,核心是管道输入的消费规则问题:子shell中curl是第一个启动的进程,会默认抢占当前shell的标准输入流,等curl完成脚本下载、将脚本内容传递给sh执行时,管道里传入的Test Data已经被curl消费丢弃,目标脚本自然读不到输入内容。
可行方案
通过命令替换先拉取完整脚本内容作为sh的执行参数,预留标准输入流给脚本读取数据即可,单行命令如下:
echo "Test Data" | sh -c "$(curl -sfL http://example.com/do-stuff.sh)"
逻辑说明
$(curl -sfL http://example.com/do-stuff.sh)会优先完成远程脚本的拉取,将完整脚本内容作为字符串参数传给sh -c执行- 整个命令的标准输入流不会被
curl占用,会直接透传给运行脚本的sh进程,脚本可以正常读取管道传入的内容 - 全程不会在本地生成实体脚本文件,符合需求
安全提示:直接执行远程来源的脚本存在安全风险,请务必确认脚本来源可信后再运行上述命令
内容的提问来源于stack exchange,提问作者rubenhak
相关产品推荐
相关产品推荐

