如何向cloud-init-per正确传递带短横线的命令参数?
解决cloud-init-per传递带短横线命令参数的问题
可行解决方案
使用sh -c将目标命令包装为shell命令字符串,彻底避免cloud-init-per误解析带短横线的参数:
bootcmd: - [cloud-init-per, once, mkdir_samba, sh, -c, "mkdir -m 0755 -p /etc/samba"]
其中mkdir_samba是自定义的任务标识名称,可根据实际需求修改。
问题原因分析
直接传递参数的问题:cloud-init-per的脚本逻辑中,
once后的第一个参数被视为任务名称,后续参数会被直接当作命令及参数传递,但它不支持--作为自身参数与命令参数的分隔符,导致-m、-p这类带短横线的参数被误判为cloud-init-per自身的参数,触发-m: not found错误。添加
---后报错的原因:此时---被当作了任务名称,后续的0755在传递过程中被解析为十进制数值,而mkdir的-m参数需要的是八进制模式字符串,十进制493对应八进制0755,因此出现mkdir: invalid mode ‘493’的错误。
替代方案(复杂场景适用)
如果需要执行的命令逻辑较复杂,可以编写独立shell脚本,通过cloud-init-per执行:
write_files: - content: | #!/bin/sh mkdir -m 0755 -p /etc/samba path: /tmp/mkdir_samba.sh permissions: '0755' bootcmd: - [cloud-init-per, once, run_mkdir_script, /tmp/mkdir_samba.sh]
cloud-init会先创建脚本文件并赋予执行权限,再通过cloud-init-per执行,完全规避参数解析冲突。
内容的提问来源于stack exchange,提问作者mastier
相关产品推荐
相关产品推荐

