Shell escape dollar signs
But allow for shell expansion using curly braces e.g. ${PWD}
This commit is contained in:
15
README.md
15
README.md
@@ -331,6 +331,21 @@ servers:
|
||||
my-label: "50"
|
||||
```
|
||||
|
||||
### Using shell expansion
|
||||
|
||||
You can use shell expansion to interpolate values from the host machine into labels and env variables with the `${}` syntax.
|
||||
Anything within the curly braces will be executed on the host machine and the result will be interpolated into the label or env variable.
|
||||
|
||||
```yaml
|
||||
labels:
|
||||
host-machine: "${cat /etc/hostname}"
|
||||
|
||||
env:
|
||||
HOST_DEPLOYMENT_DIR: "${PWD}"
|
||||
```
|
||||
|
||||
Note: Any other occurrence of `$` will be escaped to prevent unwanted shell expansion!
|
||||
|
||||
### Using container options
|
||||
|
||||
You can specialize the options used to start containers using the `options` definitions:
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
module Mrsk::Utils
|
||||
extend self
|
||||
|
||||
DOLLAR_SIGN_WITHOUT_SHELL_EXPANSION_REGEX = /\$(?!{[^\}]*\})/
|
||||
|
||||
# Return a list of escaped shell arguments using the same named argument against the passed attributes (hash or array).
|
||||
def argumentize(argument, attributes, sensitive: false)
|
||||
Array(attributes).flat_map do |key, value|
|
||||
@@ -75,7 +77,9 @@ module Mrsk::Utils
|
||||
|
||||
# Escape a value to make it safe for shell use.
|
||||
def escape_shell_value(value)
|
||||
value.to_s.dump.gsub(/`/, '\\\\`')
|
||||
value.to_s.dump
|
||||
.gsub(/`/, '\\\\`')
|
||||
.gsub(DOLLAR_SIGN_WITHOUT_SHELL_EXPANSION_REGEX, '\$')
|
||||
end
|
||||
|
||||
# Abbreviate a git revhash for concise display
|
||||
|
||||
@@ -49,5 +49,16 @@ class UtilsTest < ActiveSupport::TestCase
|
||||
test "escape_shell_value" do
|
||||
assert_equal "\"foo\"", Mrsk::Utils.escape_shell_value("foo")
|
||||
assert_equal "\"\\`foo\\`\"", Mrsk::Utils.escape_shell_value("`foo`")
|
||||
|
||||
assert_equal "\"${PWD}\"", Mrsk::Utils.escape_shell_value("${PWD}")
|
||||
assert_equal "\"${cat /etc/hostname}\"", Mrsk::Utils.escape_shell_value("${cat /etc/hostname}")
|
||||
assert_equal "\"\\${PWD]\"", Mrsk::Utils.escape_shell_value("${PWD]")
|
||||
assert_equal "\"\\$(PWD)\"", Mrsk::Utils.escape_shell_value("$(PWD)")
|
||||
assert_equal "\"\\$PWD\"", Mrsk::Utils.escape_shell_value("$PWD")
|
||||
|
||||
assert_equal "\"^(https?://)www.example.com/(.*)\\$\"",
|
||||
Mrsk::Utils.escape_shell_value("^(https?://)www.example.com/(.*)$")
|
||||
assert_equal "\"https://example.com/\\$2\"",
|
||||
Mrsk::Utils.escape_shell_value("https://example.com/$2")
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user