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
-i
flag 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ê.