有没有什么聪明的方法可以通过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"

Explanation

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

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

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

Linux相关问答推荐

PERF显示不应该执行指令的内核的用户空间周期

Postfix 连接到 domain.com[74.208.61.85]:587: 连接被 dovecot、opendkim 和 SSL 拒绝

cu可以从串口读取,但我自己的C程序不能

ShellScript,有更好的方法来查找具有特定名称和日期的文件吗?

Git在某些文件中添加回车符,尽管autocrlf已关闭

Linux BlueZ 5.65 hcitool 结合服务 UUID 和制造数据广告

如何在 Linux 上打印带有屏蔽值的环境名称?

如何从 2 个文件中获取内容并使用 shell 脚本将该内容附加到新文件中

如何在Linux中将文件的特定行号中的数字乘以2(双)?

Linux 如何将主机文件作为用户的输入并将其调用到脚本中

如何在文本文件中向左移动特定单元格

什么是`quote`命令?

DMA 和内存映射 IO 有什么区别?

如何获取 CPU 使用率

如何删除 Mercurial 存储库

如何让 cron 每N分钟运行一次,其中 n % 5 == 1?

Docker:您是否try 连接到没有 TLS 的启用 TLS 的守护进程?

在 Linux 上更新 PyCharm

`os.symlink` 与 `ln -s`

如何在 docker 容器中运行 cron 作业(job)