函数扩展ssh执行

函数扩展ssh执行

作为在另一台(备份)服务器上运行的脚本的一部分,我正在尝试编写一个通过 ssh 远程执行随机命令的函数。为了简单起见,我希望保留现有代码的大部分原样。

我正在尝试做的一个例子:

function NC_SSH_CMD () {
   cmdArgs=("$@")
   ssh -i [email protected] "bash -s" < ${cmdArgs[@]}
}

NC_SSH_CMD sudo -u "${webserverUser}" php ${nextcloudFileDir}/occ maintenance:mode --on

基本上,我想使用 NC_SSH_CMD 作为应通过 ssh 远程运行的命令的前缀。因此,传递的参数应被视为带有参数的远程命令。虽然我将 cmdArgs 用作数组的方式是错误的。它引发了错误:

${cmdArgs[@]}: ambiguous redirect

将命令传递给函数并执行它的正确方法是什么?

编辑:

命令本身有一个错误,与问题无关。由于错误不直观,我没有发现它。这有效。但是有没有更好的方法来处理将字符串传递给命令?

function NC_SSH_CMD () {
   $(ssh [email protected]  "$*")
}

答案1

操作<员重定向文件通过标准输入。要重定向细绳在 bash 中,你可以使用这里是字符串

function NC_SSH_CMD () {
   cmdArgs=("$@")
   ssh -i path/to/identityfile [email protected] "bash -s" <<< "${cmdArgs[@]}"
}

记得引用数组扩展,${cmdArgs[@]}否则其元素将受到分词和可能的文件名生成。


请注意,除非${cmdArgs[@]}需要专门在 bash shell 中运行,并且您知道远程 root shell 不是 bash,否则您也可以省略bash -s并将扩展的参数列表直接传递给默认远程 shell,正如您所发现的那样。但是您应该使用"${cmdArgs[@]}"(或"$@") 代替,"$*"因为后者将参数连接到单个字符串而不是单独传递它们:

function NC_SSH_CMD () {
   ssh -i path/to/identityfile [email protected] "$@"
}

相关内容