我希望能够“欺骗”我机器上的某些命令,实际上是在远程系统上调用它们。例如。每当我跑:
getListFromFiles
我希望实际的命令是:
cmd options
理想情况下,我想要一个名为ssh user@host cmd options
的文件夹,将其添加到我的spoof
,并在其中有一个名为PATH
的可执行文件,可以进行欺骗。如果我有很多命令,这可能会很乏味。任何人都有一个很好的方法来解决这个问题?这样我以后可以添加和删除很多命令吗?并且,我希望能够准确地(或尽可能准确地)传递所有参数,并且我想欺骗的每个命令都只有cmd
。
这样做的原因是我在我的机器上运行了一个容器(特别是ssh user@host
),并且有一些我不想真正想要容器化的命令,但仍然希望从容器内运行。我发现只需在它前面附加singularity
即可获得我想要的功能。例如ssh
和sbatch
这些容易受到影响,我只是使用ssh来调用它们。这些程序使用的文件被写入绑定点,因此主机可以很好地看到它们。
答案 0 :(得分:2)
以下脚本可以在您希望透明代理的所有命令名称下进行硬链接:
#!/usr/bin/env bash
printf -v str '%q ' "${0##*/}" "$@"
ssh host "$str"
somecommand "hello world"
和somecommand "hello" "world"
可以通过线上相同的方式表示。printf
(包括bash和ksh实现)中,%q
将替换为相应值的转义形式,该eval
将被重新标记为原始值(文字)文字,如果稍后解释。printf -v varname
将printf
的输出存储在名为varname
的变量中,而不会产生命令替换的开销/效率低下。 (在ksh93中,varname=$(printf ...)
被优化为跳过子shell开销,所以这不是必需的。)$0
计算为argv[0]
,按惯例,它是当前正在运行的命令的名称。 (这可以被覆盖,但你相信你的用户行为合理......对吗?)${0##*/}
是一个parameter expansion,只返回/
中最后一个$0
之后的内容(如果它实际上包含任何斜杠;否则,原始值将不加修改地使用)。"$@"
指的是传递给脚本的确切参数向量。