如何从凭证存储下载詹金斯秘密文件?
How do I download a jenkins secret file from the credential store?
我只能上传现有的 jenkins 秘密文件,不能下载现有文件。
如何下载我上传的现有机密文件以确认其内容?
如果您有 shell 访问权限和 sudo/root
/Jenkins Unix 用户 权限machine 运行 Jenkins,您可以通过执行以下操作来检索秘密文件:
- 在某些有权访问机密文件的 Jenkins 作业中,select 配置。
- 在Configuration界面上,在Build Environment下,select Use secret text(s)或文件.
- 单击添加 -> 秘密文件。这将创建一个新的 Secret file 绑定。
- Select 特定凭据,然后从其下方的下拉菜单中 select 您要检索的秘密文件。假设您的秘密文件存储在文件名 my-secret-file.txt.
下
- 为这个秘密文件分配一个变量,例如
MY_SECRET_FILE_TXT
.
- 现在,在 Pre Steps 下,单击 Add pre-build step -> Execute shell .
在 Command 文本区域,添加以下 shell 脚本:
echo "executing user is $(whoami)"
# remove my-secret-file.txt before possibly getting an overwriting error
rm -f $WORKSPACE/my-secret-file.txt
echo "Jenkins project workspace: $WORKSPACE"
cp $MY_SECRET_FILE_TXT $WORKSPACE
- 单击保存 以保存此配置。
下次为该项目触发构建时,秘密文件应出现在该项目的工作区中,即位置 $WORKSPACE/my-secret-file.txt
。例如,在我的 Ubuntu 14.04.5 LTS 安装包和守护程序 jenkins
上,该位置是 /var/lib/jenkins/workspace/$JENKINS_PROJECT_NAME/my-secret-file.txt
如果您可以访问 Jenkins 实例的脚本控制台(例如通过在浏览器中访问 https://jenkins.example.com/script),您可以 运行 以下脚本:
import com.cloudbees.plugins.credentials.*;
import com.cloudbees.plugins.credentials.domains.Domain;
import org.jenkinsci.plugins.plaincredentials.impl.FileCredentialsImpl;
println "Jenkins credentials config file location=" + SystemCredentialsProvider.getConfigFile();
println ""
def fileName = "my-secret-file.txt"
SystemCredentialsProvider.getInstance().getCredentials().stream().
filter { cred -> cred instanceof FileCredentialsImpl }.
map { fileCred -> (FileCredentialsImpl) fileCred }.
filter { fileCred -> fileName.equals( fileCred.getFileName() ) }.
forEach { fileCred ->
String s = new String( fileCred.getSecretBytes().getPlainData() )
println "XXXXXX BEGIN a secret file with fileName=" + fileName + " XXXXXXXXXXXX"
println s
println "XXXXXX END a secret file with fileName=" + fileName + " XXXXXXXXXXXX"
println ""
}
将fileName
更改为您要打印的文件名。
此脚本将打印出 Jenkins 凭证存储的全局域中文件名为 fileName
的文件内容。
此脚本的可修复警告:
- 要求 Jenkins 运行在 Java 8 JVM 中运行。
这个脚本。
- 仅在 全局凭证域 中查找(请参阅 https://javadoc.jenkins.io/plugin/credentials/com/cloudbees/plugins/credentials/SystemCredentialsProvider.html#getCredentials--)。
脚本控制台的标记答案很棒。
还有这个脚本会列出所有可以从控制台 运行 获得的秘密:
https://github.com/tkrzeminski/jenkins-groovy-scripts/blob/master/show-all-credentials.groovy
我通常通过创建这样的作业来从 jenkins 中提取秘密:
Jenkins 屏蔽了输出中的所有键,因此打印出来时只需替换一个字符即可。如果你的密钥中有另一个 0
,它将显示为 *******
,你可以尝试替换一个不同的字符,或者将它分成两半并在不同的行上打印两半,或者另一个类似的技巧。
您也可以像这样直接将其粘贴到文件中。
echo $HELLO > slack-key.txt
我只能上传现有的 jenkins 秘密文件,不能下载现有文件。
如何下载我上传的现有机密文件以确认其内容?
如果您有 shell 访问权限和 sudo/root
/Jenkins Unix 用户 权限machine 运行 Jenkins,您可以通过执行以下操作来检索秘密文件:
- 在某些有权访问机密文件的 Jenkins 作业中,select 配置。
- 在Configuration界面上,在Build Environment下,select Use secret text(s)或文件.
- 单击添加 -> 秘密文件。这将创建一个新的 Secret file 绑定。
- Select 特定凭据,然后从其下方的下拉菜单中 select 您要检索的秘密文件。假设您的秘密文件存储在文件名 my-secret-file.txt. 下
- 为这个秘密文件分配一个变量,例如
MY_SECRET_FILE_TXT
. - 现在,在 Pre Steps 下,单击 Add pre-build step -> Execute shell .
在 Command 文本区域,添加以下 shell 脚本:
echo "executing user is $(whoami)" # remove my-secret-file.txt before possibly getting an overwriting error rm -f $WORKSPACE/my-secret-file.txt echo "Jenkins project workspace: $WORKSPACE" cp $MY_SECRET_FILE_TXT $WORKSPACE
- 单击保存 以保存此配置。
下次为该项目触发构建时,秘密文件应出现在该项目的工作区中,即位置 $WORKSPACE/my-secret-file.txt
。例如,在我的 Ubuntu 14.04.5 LTS 安装包和守护程序 jenkins
上,该位置是 /var/lib/jenkins/workspace/$JENKINS_PROJECT_NAME/my-secret-file.txt
如果您可以访问 Jenkins 实例的脚本控制台(例如通过在浏览器中访问 https://jenkins.example.com/script),您可以 运行 以下脚本:
import com.cloudbees.plugins.credentials.*;
import com.cloudbees.plugins.credentials.domains.Domain;
import org.jenkinsci.plugins.plaincredentials.impl.FileCredentialsImpl;
println "Jenkins credentials config file location=" + SystemCredentialsProvider.getConfigFile();
println ""
def fileName = "my-secret-file.txt"
SystemCredentialsProvider.getInstance().getCredentials().stream().
filter { cred -> cred instanceof FileCredentialsImpl }.
map { fileCred -> (FileCredentialsImpl) fileCred }.
filter { fileCred -> fileName.equals( fileCred.getFileName() ) }.
forEach { fileCred ->
String s = new String( fileCred.getSecretBytes().getPlainData() )
println "XXXXXX BEGIN a secret file with fileName=" + fileName + " XXXXXXXXXXXX"
println s
println "XXXXXX END a secret file with fileName=" + fileName + " XXXXXXXXXXXX"
println ""
}
将fileName
更改为您要打印的文件名。
此脚本将打印出 Jenkins 凭证存储的全局域中文件名为 fileName
的文件内容。
此脚本的可修复警告:
- 要求 Jenkins 运行在 Java 8 JVM 中运行。 这个脚本。
- 仅在 全局凭证域 中查找(请参阅 https://javadoc.jenkins.io/plugin/credentials/com/cloudbees/plugins/credentials/SystemCredentialsProvider.html#getCredentials--)。
脚本控制台的标记答案很棒。
还有这个脚本会列出所有可以从控制台 运行 获得的秘密: https://github.com/tkrzeminski/jenkins-groovy-scripts/blob/master/show-all-credentials.groovy
我通常通过创建这样的作业来从 jenkins 中提取秘密:
Jenkins 屏蔽了输出中的所有键,因此打印出来时只需替换一个字符即可。如果你的密钥中有另一个 0
,它将显示为 *******
,你可以尝试替换一个不同的字符,或者将它分成两半并在不同的行上打印两半,或者另一个类似的技巧。
您也可以像这样直接将其粘贴到文件中。
echo $HELLO > slack-key.txt