sshpass -p 'password' ssh [email protected] "some_cmd $(printf '%q ' "$@")"
sshpass -p 'password' ssh [email protected] "f() for i; do some_cmd "$i"; done; f $(printf '%q ' some_cmd "$@")"
De acordo com sshpass manpage,
sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments
Portanto, você deve ser capaz de passar todo o "$@"
para o comando ssh, como:
sshpass -p 'password' ssh [email protected] printf '%q\n' "$@"
Como seu comando de destino pode não ser capaz de lidar com esse processamento de argumentos, podemos alterar isso:
sshpass -p 'password' 'k(){ for i; do echo $i; done; }; k' "$@"
Vamos testar com alguns espaços em branco ...
set -- 'foo bar' $'lorem\nipsum\td'
# paste that two lines.. Since I don't have sshpass installed, just using ssh.
ssh
aparentemente estragou tudo. Vamos encaixar alguns shell falsificados e ver o que aconteceu ..
#!/bin/bash
# /bin/mysh
# someone:x:1000:1000:FOo,,Bar,:/home/foo:/bin/mysh
printf '%q ' bash "$@"; echo;
exec bash -xv --norc "$@";
Hmm. Vamos tentar.
bash -c $'printf %q\n foo bar lorem\nipsum\td'
printf %q\n foo bar lorem
+ printf %qn foo bar lorem
ipsum d
+ ipsum d
bash: line 1: ipsum: command not found
Então, aparentemente ssh simplesmente concatenou essas coisas com espaços. Não é legal.
Vamos pré-escapar do nosso lado com printf '%q '
, e você obterá o TL; DR resposta.
Agora você pode descobrir sobre o EOF e o -c
também.
Nota: Não tenho certeza se o ssh faz a coisa -c diferentemente entre as versões. Você pode precisar tentar isso sozinho. Pelo menos isso é verdade para o OpenSSH 7.1 ( ssh.c: 955-969 ).