外壳脚本:通过 ssh 从脚本运行函数



有什么聪明的方法可以通过ssh在远程主机上运行本地Bash函数吗?

例如:

#!/bin/bash
#Definition of the function
f () {  ls -l; }
#I want to use the function locally
f
#Execution of the function on the remote machine.
ssh user@host f
#Reuse of the same function on another machine.
ssh user@host2 f

是的,我知道它不起作用,但是有没有办法实现这一目标?

您可以使用

typeset 命令通过 ssh 在远程计算机上使用函数。有几个选项,具体取决于您希望如何运行远程脚本。

#!/bin/bash
# Define your function
myfn () {  ls -l; }

要在远程主机上使用该函数,请执行以下操作:

typeset -f myfn | ssh user@host "$(cat); myfn"
typeset -f myfn | ssh user@host2 "$(cat); myfn"

更好的是,为什么要打扰管道:

ssh user@host "$(typeset -f myfn); myfn"

或者你可以使用一个 HEREDOC:

ssh user@host << EOF
    $(typeset -f myfn)
    myfn
EOF

如果你想发送脚本中定义的所有函数,而不仅仅是myfn,只需使用这样的typeset -f

ssh user@host "$(typeset -f); myfn"

解释

typeset -f myfn将显示myfn的定义。

cat 将以文本形式接收函数的定义,$()将在当前 shell 中执行它,该 shell 将成为远程 shell 中定义的函数。最后,可以执行该函数。

最后一个代码将在 ssh 执行之前将函数的定义内联。

我个人不知道你的问题的正确答案,但我有很多安装脚本只是使用 ssh 复制自己。

让命令复制文件,加载文件函数,

运行文件函数,然后删除文件。

ssh user@host "scp user@otherhost:/myFile ; . myFile ; f ; rm Myfile"

另一种方式:

#!/bin/bash
# Definition of the function
foo () {  ls -l; }
# Use the function locally
foo
# Execution of the function on the remote machine.
ssh user@host "$(declare -f foo);foo"

declare -f foo打印函数的定义

相关内容

  • 没有找到相关文章