fix: preserve arguments such as --version and -n when running commands over ssh

xargs without a command runs /bin/echo per word, which interprets --version, --help, -n, -e and -E as its own options. Use printf with a NUL delimiter instead.

Closes #9120
This commit is contained in:
Jose Diaz-Gonzalez
2026-10-11 04:33:08 -04:00
parent 80409c7c59
commit c3a4b79e6e
2 changed files with 9 additions and 1 deletions

2
dokku
View File

@@ -118,7 +118,7 @@ if [[ -n "$SSH_ORIGINAL_COMMAND" ]]; then
exit_code=$?
set +f
else
readarray -t -O "${#ssh_arg_array[@]}" ssh_arg_array < <(printf '%s' "$SSH_ORIGINAL_COMMAND" | xargs -n 1)
readarray -d '' -O "${#ssh_arg_array[@]}" ssh_arg_array < <(printf '%s' "$SSH_ORIGINAL_COMMAND" | xargs -r printf '%s\0')
set -f
$0 "${ssh_arg_array[@]}"
exit_code=$?

View File

@@ -37,6 +37,14 @@ teardown() {
assert_success
}
@test "(core) ssh arguments are passed through unchanged" {
run ssh "dokku@$DOKKU_DOMAIN" fakecommand --version --help -n -e -E
echo "output: $output"
echo "status: $status"
assert_failure
assert_output_contains '`fakecommand --version --help -n -e -E` is not a dokku command.'
}
@test "(core) urls (non-ssl)" {
assert_urls "http://${TEST_APP}.${DOKKU_DOMAIN}"