我有一个远程 SSH 服务器,其中包含几个适合我工作的自定义实用程序。然而,有时我会感到懒惰,不想仅仅为了执行单个命令而启动完整的 SSH 会话。
这促使我创建一个类似于 BusyBox 的多调用脚本,我可以创建符号链接,以查看调用它的名称,并在我的服务器上运行匹配的命令并转发我给它的任何参数。
我首先想到了这个:
#!/bin/bash
exec ssh -q -t my-server "$(basename "$0")" "${@@Q}"
但这并没有PATH
正确设置我的,所以我无法使用我的所有程序。
接下来,我尝试将 bash 作为登录 shell:
exec ssh -q -t my-server bash -l "$(basename "$0")" "${@@Q}"
但每当我运行不是 bash 脚本的东西时,我都会收到这样的错误:
/bin/ls: /bin/ls: cannot execute binary file
我尝试将命令字符串传递给 bash:
exec ssh -q -t my-server bash -l -c "$(basename "$0")" "${@@Q}"
这正确设置了 PATH 并执行二进制文件,但我传递给二进制文件的任何参数都会丢失。
我尝试将参数作为这里字符串传递:
exec ssh -q -t my-server bash -l <<< "$(basename "$0") ${*@Q}"
但互动节目会立即关闭。
我想做的事情可能吗?如何通过 SSH 运行不符合标准的任意远程命令PATH
,并使其表现得像我正常登录一样?
答案1
看来我需要添加另一级转义引号才能使 bash 正确运行命令。到目前为止,这完全按照我想要的方式工作。
#!/bin/bash
exec ssh -q -t eng-vm bash -l -c \""$(basename "$0") ${*@Q}"\"