Parece-me que há duas maneiras de abordar isso:
-
Focando em conseguir que seu comando seja executado no diretório correto. Para isso, sugiro o
-iflag sudo, que irá configurar as coisas para ser um ambiente como se você estivesse logado como aquele usuário, então:ssh domain.com sudo -iu user ls -
Concentre-se em resolver o problema de citação, para que seu comando citado ainda possa ser tratado como um argumento para
bash, para que ele seja executado como uma única cadeia de comando. Para isso, neste caso, parece que você só precisa de mais um nível de citação, assim:ssh domain.com sudo -u user bash -c "'cd /home/user/ && ls'"ou:
ssh domain.com sudo -u user bash -c '"cd /home/user/ && ls"'Explicação: O shell em que você chama ssh ocupa um conjunto de aspas, passando ssh a seguinte lista de argumentos (usando o primeiro exemplo acima) (como
argv, apósargv[0]of ssh):-
domain.com -
sudo -
-u -
user -
bash -
-c -
'cd /home/user && ls'
Isso faz com que o sudo obtenha uma lista de argumentos de:
-
-u -
user -
bash -
-c -
cd /home/user && ls
qual sudo então analisa seus próprios argumentos, e então entrega o resto para bash de outra forma não modificado, de tal forma que o bash recebe os argumentos:
-
-c -
cd /home/user && ls
e o bash então toma seu segundo argumento como uma cadeia de comandos, como se tivesse sido digitado em um shell interativo, e então executa o primeiro comando (
cd /home/user), também (por causa de&&) executando o comando segundo (ls) se o primeiro for bem sucedido. -
Francamente, eu provavelmente iria com a primeira opção ... Mas a segunda também funciona para o seu exemplo trivial, e dependendo da realidade do seu problema real, pode ou não ser melhor para você.