作为在另一台(备份)服务器上运行的脚本的一部分,我正在尝试编写一个通过 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] "$@"
}