如何在不知道远程用户的登录shell的情况下通过ssh执行任意简单的命令?
ssh 在运行时具有令人讨厌的功能: ssh user@host cmd and "here's" "one arg" 而不是cmd使用参数将其打开host,而是cmd使用空格将其和参数连接在一起,然后运行shell host来解释结果字符串(我猜这就是为什么调用它ssh而不是它的原因sexec)。 更糟糕的是,您不知道将使用什么shell来解释该字符串,因为user甚至登录的shell 都无法保证是Bourne,因为仍然有人们在使用它tcsh作为登录shell,并且这种fish情况还在增加。 有办法解决吗? 假设我有一个命令作为存储一个在参数列表bash阵列,其每一个可以包含的非空字节的任何序列,是否有任何方式把它上执行host如user以一致的方式,无论该登录壳的user上host(我们假设这是主要的Unix shell系列之一:Bourne,csh,rc / es,fish)? 另一种合理的假设,我应该能够提出的是,有是sh在命令host中可用的$PATH是Bourne兼容。 例: cmd=( 'printf' '<%s>\n' 'arg with $and spaces' '' # empty $'even\n* * *\nnewlines' "and 'single quotes'" '!!' ) 我可以使用ksh/ zsh/ bash/ 在本地运行yash: $ "${cmd[@]}" <arg with $and spaces> <> <even …