通过SSH连接代理命令

时间:2017-10-04 16:59:27

标签: linux bash unix ssh

我希望能够“欺骗”我机器上的某些命令,实际上是在远程系统上调用它们。例如。每当我跑:

getListFromFiles

我希望实际的命令是:

cmd options

理想情况下,我想要一个名为ssh user@host cmd options 的文件夹,将其添加到我的spoof,并在其中有一个名为PATH的可执行文件,可以进行欺骗。如果我有很多命令,这可能会很乏味。任何人都有一个很好的方法来解决这个问题?这样我以后可以添加和删除很多命令吗?并且,我希望能够准确地(或尽可能准确地)传递所有参数,并且我想欺骗的每个命令都只有cmd

这样做的原因是我在我的机器上运行了一个容器(特别是ssh user@host),并且有一些我不想真正想要容器化的命令,但仍然希望从容器内运行。我发现只需在它前面附加singularity即可获得我想要的功能。例如sshsbatch这些容易受到影响,我只是使用ssh来调用它们。这些程序使用的文件被写入绑定点,因此主机可以很好地看到它们。

1 个答案:

答案 0 :(得分:2)

以下脚本可以在您希望透明代理的所有命令名称下进行硬链接:

#!/usr/bin/env bash
printf -v str '%q ' "${0##*/}" "$@"
ssh host "$str"
  • SSH将其所有参数组合成一个字符串,然后由远程shell执行。要确保远程参数与本地参数相同,值必须转义;否则,somecommand "hello world"somecommand "hello" "world"可以通过线上相同的方式表示。
  • 在适当扩展的printf(包括bash和ksh实现)中,%q将替换为相应值的转义形式,该eval将被重新标记为原始值(文字)文字,如果稍后解释。
  • printf -v varnameprintf的输出存储在名为varname的变量中,而不会产生命令替换的开销/效率低下。 (在ksh93中,varname=$(printf ...)被优化为跳过子shell开销,所以这不是必需的。)
  • $0计算为argv[0],按惯例,它是当前正在运行的命令的名称。 (这可以被覆盖,但你相信你的用户行为合理......对吗?)
  • ${0##*/}是一个parameter expansion,只返回/中最后一个$0之后的内容(如果它实际上包含任何斜杠;否则,原始值将不加修改地使用)。
  • "$@"指的是传递给脚本的确切参数向量。