Você pode fazer ssh foo bash --login -c '"exec \
. strace
\$@"' ls -lrt
Para descobrir o que realmente acontece, ssh foo strace -vff -e execve bash --login -c 'exec $0 "$@"' ls -lrt
é seu amigo.
execve("/bin/bash", ["bash", "--login", "-c", "exec", "zsh", "ls", "-lrt"], [LANG=…]
me dá algo como:
$0
Meu shell é zsh, o que deve lhe dar uma dica do que está acontecendo aqui: Esse $0
é interpretado pelo shell gerado para analisar a linha de comando enviada pelo comando SSH. Se apenas escaparmos das partes "$@"
e ssh foo strace -vff -e execve bash --login -c 'exec \
como: execve("/bin/bash", ["bash", "--login", "-c", "exec", "$0", "$@", "ls", "-lrt"], ["LANG=..
"\$@"' ls -lrt--login
, obtemos:
-c
. Como você pode ver aqui, o bash é chamado com os argumentos exec
, $0
, exec
, -c
e assim por diante. Isso não nos leva até onde queremos estar, já que agora está efetivamente chamando ssh foo strace -vff -e execve bash --login -c '"exec \
por si só. Para contornar isso, precisamos citar o que vem depois do argumento execve("/bin/bash", ["bash", "--login", "-c", "exec $0 $@", "ls", "-lrt"], ["LANG=…
\$@"' ls -lrt$@
para que ele não seja descompactado muito cedo, como "$@"
:
ssh foo strace -vff -e execve bash --login -c '"exec \
execve("/bin/bash", ["bash", "--login", "-c", "exec $0 \"$@\"", "ls", "-lrt"], ["LANG=…
\"\$@\""' ls -lrt
Isso é aceito pelo bash, já que permite usar ls -lrt
, mas se você está escrevendo o POSIX sh adequado, você deve usar bash --login
, nesse caso a resposta correta é ssh foo 'ls -lrt'
:
%code%
Suponho que você esteja usando %code% como um proxy para algum outro comando mais complexo que realmente precise de %code% e tal, apenas faça o que foi sugerido no primeiro comentário e use %code% .