gpt4 book ai didi

linux - 通过 SSH 连接代理命令

转载 作者:太空宇宙 更新时间:2023-11-04 04:44:23 25 4
gpt4 key购买 nike

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

cmd options

我希望实际的命令是:

ssh user@host cmd options

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

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

最佳答案

以下脚本可以硬链接(hard link)到您希望透明代理的所有命令名称下:

#!/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 中最后一个 / 之后的内容(它实际上应该包含任何斜杠;否则,将不加修改地使用原始值)。
  • "$@" 指传递给脚本的确切参数向量。

关于linux - 通过 SSH 连接代理命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46570318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com