travis encryption docs提到我必须先对其密码进行bash转义,然后再对其进行加密:
有关转义某些符号的说明
使用travis加密对敏感数据进行加密时,请务必注意,它将作为bash语句处理。这意味着您要加密的机密在bash解析时不会引起错误。数据不完整会导致bash将错误声明转储到日志中,该日志包含部分敏感数据。
因此,您需要转义特殊字符,例如大括号,括号,反斜杠和竖线符号。例如,当您要将字符串
6&a(5!1Ab\
分配给FOO
时,需要执行:
travis encrypt "FOO=6\\&a\\(5\\!1Ab\\\\"
bash的答案似乎与printf "%q"
有关,但是要弄清楚如何将printf
与travis
cli连接起来仍然很复杂。
让travis encrypt
执行应做的重击一线是什么?
我的意思是,我想粘贴我的变量名及其值,并确保将其正确加密,而不必担心bash转义。假设我想将字符串6&a(5!1Ab\
分配给变量FOO
,我们可以继续上面的示例。
在我们讨论时,travis env set
对应的单线是什么?这将有助于那些解决data too large
错误的人。
答案 0 :(得分:3)
基于Java encrypt AES, PHP decrypt AES:
read -r && travis encrypt "$(printf %q "$REPLY")"
然后粘贴您的变量及其值:
FOO=6&a(5!1Ab\
答案 1 :(得分:2)
让
travis encrypt
执行应做的重击一线是什么?我的意思是,我想粘贴我的变量名及其值,并确保将其正确加密,而不必担心bash转义。
这通常是不可能的,因为如果要将值插入命令行,则必须使用某种形式的引号,因此必须特别处理至少一个引号字符(如果允许在值中出现)并且不能简单地处理粘贴这就是如果在值中出现'
的情况下,将值封闭在'
'
中的原因(并且肯定会允许在密码中使用'
)。因此,仅当 单行 的要求被放弃并且该值作为输入提供时,才能满足粘贴该值的要求。
然后,由于travis encrypt
命令需要对参数进行额外的引用(也许是因为,如chepner认为的那样,调用了eval
),因此我们可以在printf %q
中提供此引用,例如G。
read -r
6&a(5!1Ab\
travis encrypt "$(printf %q "FOO=$REPLY")"
(要粘贴的粗线)。
如何将
VAR=VALUE
放在read
语句中以将所有内容放在一起?read -r
,粘贴FOO=6&a(5!1Ab\
,最后粘贴travis encrypt "$(printf %q "$REPLY")"
。
当然也可以。
此外,真的没有办法将
read -r
的结果传递给travis encrypt
吗?
如果您的意思是管道,那么不能,就没有办法将某些东西管道传递给仅需要参数的命令。但是,如果您只是想知道我们是否可以连接命令,那么可以,我们也可以编写e。 G。
read -r; travis encrypt "$(printf %q "$REPLY")"
FOO=6&a(5!1Ab\
答案 2 :(得分:1)
仅对字符串进行base64并在构建中对其进行解码要容易得多。使用travis中的转义功能可以节省所有麻烦事。
Travis和任何其他CI / CD服务都允许秘密存储秘密环境变量,以供每次构建使用。在设置项目构建时,添加环境变量选项。要回显cli中用于base64的密码,您仍然需要转义该字符串,因为该字符串需要由bash评估。使用您的密码创建一个临时文件。然后:
cat /tmp/secret | base64 -w 0
复制字符串并将其粘贴到travis ci env var设置的值字段中
在.travis.yaml
文件中只需简单地检索机密:
echo $SECRET | base64 -d
虽然可能会有一些极端情况,但这应该可以解决大多数用例。