Merge pull request #9130 from dokku/fix-ssh-arg-splitting

Preserve arguments such as --version and -n when running commands over SSH
This commit is contained in:
Jose Diaz-Gonzalez
2026-10-14 15:13:13 -04:00
committed by GitHub
3 changed files with 29 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}"

View File

@@ -30,6 +30,26 @@ teardown() {
assert_failure
}
@test "(run) run over ssh preserves echo-like arguments" {
run deploy_app
echo "output: $output"
echo "status: $status"
assert_success
run /bin/bash -c "ssh dokku@$DOKKU_DOMAIN run $TEST_APP /bin/echo --version --help 2>/dev/null"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "--version --help"
# bats strips trailing newlines from $output, so count bytes to verify -n was honored
run /bin/bash -c "ssh dokku@$DOKKU_DOMAIN run $TEST_APP /bin/echo -n hello 2>/dev/null | wc -c"
echo "output: $output"
echo "status: $status"
assert_success
assert_output "5"
}
@test "(run) run:detached" {
run deploy_app
echo "output: $output"