I've a string like this: docker login -u username -p password docker-registry-url
.
I execute the command in a Groovy script with execute
. For debugging purposes, I print the command before execution, but since it contains sensitive data, I obfuscate the username and password.
def printableCmd = cmd.toString()
def m = printableCmd =~ /(?:.+) -u (.+) -p (.+) (?:.+)/
if (m.matches() && m[0].size() >= 3) {
printableCmd = m[0][-1..-2].inject(m[0][0]) { acc, val -> acc.replaceAll(val, "***") }
}
The above works as expected and prints docker login -u *** -p *** docker-registry-url
, but I'm wondering if there is a more idiomatic way to do this. Note that I don't want to delete the captured groups, just replace them with asterisks, thus making it very clear that the command is not wrong, but obfuscated for security purposes.
def cmd='docker login -u username -p password docker-registry-url'
println cmd.replaceAll(/(\s-[up]\s+)(\S+)/,'$1***')
Output:
docker login -u *** -p *** docker-registry-url
I found the following solution myself using positive look-behind:
def cmd = "docker login -u username -p password docker-registry-url"
println cmd.replaceAll(/(?<=-[up]\s)(\S+)/,"***")
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With