Problema com a combinação de ssh, bash --login e exec

1

Aqui estão algumas situações em que estou. foo é o servidor ssh no qual a senha menos login está configurada.

$ ssh foo
$ bash --login -c 'exec $0 "$@"' ls -lrt

Está funcionando como esperado.

ssh foo bash --login -c ls -lrt

Isso não está funcionando como esperado. Apenas ls está trabalhando ignorando o parâmetro -lrt .

E minha exigência é executar o primeiro exemplo com ssh como

ssh foo bash --login -c 'exec $0 "$@"' ls -lrt

Eu sei que tenho problemas do segundo exemplo em si. Mas eu estava apenas tentando fazer algo funcionar e descobrir onde está o problema. O terceiro exemplo não mostra nenhum erro / saída.

Como faço para alcançar o terceiro exemplo?

    
por RatDon 02.06.2017 / 15:46

2 respostas

2

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 \execve("/bin/bash", ["bash", "--login", "-c", "exec", "$0", "$@", "ls", "-lrt"], ["LANG=.. "\$@"' ls -lrt como: --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 \execve("/bin/bash", ["bash", "--login", "-c", "exec $0 $@", "ls", "-lrt"], ["LANG=… \$@"' ls -lrt por si só. Para contornar isso, precisamos citar o que vem depois do argumento $@ 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% .

    
por 02.06.2017 / 20:06
1

O ssh aceita exatamente um argumento como um comando, portanto, ele deve estar entre aspas ou apóstrofos. O mesmo se aplica ao argumento bash -c - é apenas um único argumento aceito. Os outros são passados para o bash em vez de ls . O exemplo a seguir funciona bem:

ssh foo 'bash --login -c "ls -lrt"'
    
por 04.06.2017 / 11:23

Tags