我已经检查了存储这些凭据的
credentials.xml
文件,但它们不是纯文本格式,例如:<passphrase>{AAAAAAAAAAAANzxft/rDzyt8mhxpn3O72dxvVqZksL5vBJ4jNKvAjAA=}</passphrase>
注意:出于隐私原因,我对其进行了略微更改。
如何根据以上字符串解密其原始密码?
#1 楼
幸运的是,有一个hudson.util.Secret.decrypt()
函数可用于此功能,因此:在Jenkins中,请转至
/script
页面。 br /> println(hudson.util.Secret.decrypt("{XXX=}"))
或:
println(hudson.util.Secret.fromString("{XXX=}").getPlainText())
其中
{XXX=}
是您的加密密码。 相反,运行:
println(hudson.util.Secret.fromString("some_text").getEncryptedValue())
来源:gist at
tuxfight3r/jenkins-decrypt.groovy
。或者另外检查以下脚本:
tweksteen/jenkins-decrypt
,menski/jenkins-decrypt.py
。 >评论
+1,对于使用SecretBytes类的秘密文件,您可以看到我的答案。
–akostadinov
20-2-19在11:13
尝试println(hudson.util.Secret.fromString(“ {XXX =}”)。getPlainText())时无输出
– QkiZ
20-10-15在10:00
#2 楼
这是一个简短的代码段,您可以从jenkins脚本控制台运行,以将所有凭据转储为纯文本。com.cloudbees.plugins.credentials.SystemCredentialsProvider.getInstance().getCredentials().forEach{ it.properties.each { prop, val -> if (prop == "secretBytes") { println(prop + "=>\n" + new String(com.cloudbees.plugins.credentials.SecretBytes.fromString("${val}").getPlainData()) + "\n") } else { println(prop + ' = "' + val + '"') } } println("-----------------------") }
pre >
为非系统凭据提供程序列出的更复杂的版本:
import com.cloudbees.plugins.credentials.CredentialsProvider import com.cloudbees.plugins.credentials.Credentials import com.cloudbees.plugins.credentials.domains.Domain import jenkins.model.Jenkins def indent = { String text, int indentationCount -> def replacement = "\t" * indentationCount text.replaceAll("(?m)^", replacement) } Jenkins.get().allItems().collectMany{ CredentialsProvider.lookupStores(it).toList()}.unique().forEach { store -> Map<Domain, List<Credentials>> domainCreds = [:] store.domains.each { domainCreds.put(it, store.getCredentials(it))} if (domainCreds.collectMany{ it.value}.empty) { return } def shortenedClassName = store.getClass().name.substring(store.getClass().name.lastIndexOf(".") + 1) println "Credentials for store context: ${store.contextDisplayName}, of type $shortenedClassName" domainCreds.forEach { domain , creds -> println indent("Domain: ${domain.name}", 1) creds.each { cred -> cred.properties.each { prop, val -> println indent("$prop = \"$val\"", 2) } println indent("-----------------------", 2) } } }
评论
如何修改它以从所有域,所有文件夹中获取凭据?
– jmary
19年8月14日在9:47
@jmary我添加了另一个示例
–马格努斯
19年8月15日在0:58
万分感谢 :-)
– jmary
19年8月16日在9:00
如果您想要更简单的oneliner:com.cloudbees.plugins.credentials.SystemCredentialsProvider.getInstance()。getCredentials()。forEach {println it.dump()。replace('','\ n')}
– ymajoros
20 Jan 17 '20在10:36
#3 楼
基于Magnus的回答,但作为简单的单行代码,仍具有可读的输出:评论
简短而好看!
–akostadinov
20-2-19在11:03
#4 楼
记录下来,将以下代码片段粘贴到控制台中也可以完成该工作:#5 楼
带有hudson.util.Secret
的@kenorb示例很好。列出所有凭据的答案也非常有用(感谢@ymajoros提供一线支持)。 尽管使用了
secretBytes
,但仍显示加密的字符串,但这些文件不处理机密文件。在这种情况下,需要使用SecretBytes
类。假设文件为UTF-8,则可以执行以下操作: secret = "{....}"
new String(com.cloudbees.plugins.credentials.SecretBytes.fromString(secret).getPlainData())
HTH
评论
建议的答案出现错误:println(hudson.util.Secret.decrypt(“ {{xxx / wwww + yyyy / zzzz =}}”))+符号破坏了脚本。有什么建议吗?@JayBau尝试使用单括号:“ {...}”,再删除一次。
这实际上是一个SO问题的副本:stackoverflow.com/questions/37683143(尽管从技术上讲,只有在DevOps上询问链接的问题时,它才有资格作为副本)。