当前位置: 首页 > news >正文

在Shell脚本中通过ssh从脚本运行函数

文章目录

  • 在Shell脚本中通过ssh从脚本运行函数
    • declare -f 和typset -f,这两个命令有什么区别
    • declare -f 和typset -f,这两个命令可以通过ssh运行脚本中的函数吗
    • 如果我有main.sh和util.sh,并且在main.sh中引用了util.sh,该怎么办? 我应该如何通过ssh执行main.sh而不将utils.sh复制到远程计算机?

在Shell脚本中通过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执行之前将函数的定义内联。


相关讨论如下:

最好使用typeset -f f,并且只跨发送一个函数的定义
@HenkLangeveld-取决于是否有f()调用所需的函数。 在我的假设中,函数f()可能需要其他函数。 否则,您的建议将是最好的。
如何将一些参数传递给此函数?
使用任何命令的方式相同。 如果函数是f(),则可以传递f param1 param2 ...之类的参数。 在f()内部,您将把参数引用为$1, $2, ... $n
优秀的! 对于Bash,我使用declare -f而不是typeset -f。 谢谢。
当我使用它说" COMMAND NOT FOUND"(未找到命令)之类的函数时,是否定义了该函数?
@alvits很好。 但是,如果我有main.shutil.sh,并且在main.sh中引用了util.sh,该怎么办? 我应该如何通过ssh执行main.sh而不将utils.sh复制到远程计算机?
使用declare -ftypset -f时得到syntax error near unexpected token ;

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

让命令复制文件,加载文件功能,运行文件功能,然后删除文件。

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

这个方法就是相当于ssh登录远程主机后,向远程主机发送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"
ssh user@host"$(declare -f foo);foo"

这个命令是一个使用 SSH 远程调用函数的例子。下面是解释:

ssh 是远程登录协议,允许用户在不同计算机之间进行安全的远程登录和执行命令。
user@host 是你要连接的远程主机的用户名和 IP 地址或域名。
$(declare -f foo) 是将本地函数 foo 的定义转换为字符串并传递到远程主机上执行的命令。这样可以确保在远程主机上也有 foo 函数的定义。
; foo 在声明完函数后立即调用了函数 foo。

以下是示例代码:
假设你在本地机器上定义了一个名为 hello_world 的函数,并且你希望在远程主机 example.com 上执行该函数。你可以使用以下命令:

ssh user@example.com "$(declare -f hello_world); hello_world"

当你执行这个命令时,它会将本地的 hello_world 函数定义作为字符串传输到远程主机,并在远程主机上执行该函数。如果一切正常,你应该看到输出结果 Hello, World!


declare -f 和typset -f,这两个命令有什么区别

declare -f 和 type -f 都是用来查看函数定义的命令,
但是它们具有不同的作用和输出形式:

  1. declare -f function_name

declare -f 命令用于显示指定函数的定义(包括函数名、参数和函数体)。如果没有指定函数名称,则显示所有已定义的函数。

示例代码:

# 定义函数
function hello() {echo "Hello, world!"
}# 使用 declare -f 输出函数定义
declare -f hello# 输出结果为:
# hello () 
# { 
#     echo "Hello, world!"
# }# 不传递函数名称,显示所有已定义的函数
declare -f
  1. type -f function_name

type -f 命令用于显示指定函数的位置(即函数所在文件的路径)。

示例代码:

# 定义函数
function hello() {echo "Hello, world!"
}# 使用 type -f 输出函数位置
type -f hello# 输出结果为:hello is a function
# hello () 
# { 
#     echo "Hello, world!"
# }# 如果该函数在 bash 脚本中,也可以使用 type 来查看文件位置
type -f my_script.sh

因此,declare -ftype -f 的区别在于前者用于显示函数定义,后者用于显示函数位置。



declare -f 和typset -f,这两个命令可以通过ssh运行脚本中的函数吗

在Shell脚本中,可以使用ssh命令从本地机器远程登录到另一台远程机器,并在远程机器上执行命令或运行脚本。如果想要在远程机器上运行脚本中的函数,可以通过ssh命令来实现。

在使用ssh命令远程执行命令或脚本时,默认情况下不会传输环境变量或函数定义等内容。因此,为了能够在远程机器上运行脚本中的函数,需要将函数定义先传输到远程机器上,然后再调用这些函数。declare -f和typset -f命令可以分别用于显示和导出当前Shell环境中的函数定义。

例如,假设在本地机器上有一个脚本test.sh,其中包含一个名为my_function的函数。现在我们想要在远程机器上运行这个函数。我们可以使用以下命令:

$ ssh remote_host "$(declare -f my_function); my_function"

该命令将首先使用declare -f my_function显示my_function函数的定义,然后将其作为参数传递给ssh命令。在远程主机上,该命令将首先定义my_function函数,然后调用它以执行相应的操作。

类似地,也可以使用typset -f命令来显示并导出当前Shell环境中的函数定义。例如:

$ ssh remote_host "$(typset -f my_function); my_function"

需要注意的是,如果函数依赖于某些环境变量或命令,则需要在远程机器上设置这些环境变量或安装相应的命令才能正常运行。



如果我有main.sh和util.sh,并且在main.sh中引用了util.sh,该怎么办? 我应该如何通过ssh执行main.sh而不将utils.sh复制到远程计算机?

要在远程计算机上执行main.sh并引用本地计算机上的util.sh,您可以使用SSH远程执行命令来完成此操作。具体步骤如下:

  1. 在本地计算机上,将util.sh压缩为tar.gz文件,例如:
tar -czf util.tar.gz util.sh
  1. 使用scp命令将util.tar.gz文件复制到远程计算机上,例如:
scp util.tar.gz remoteuser@remotehost:/tmp/

其中remoteuser是远程计算机上的用户名,remotehost是远程计算机的地址,/tmp/是目标文件夹。

  1. 在远程计算机上,通过ssh连接到该计算机,并切换到main.sh所在的目录。

  2. 解压缩util.tar.gz文件,并在main.sh中引用util.sh文件。例如:

tar -xzf /tmp/util.tar.gz -C /tmp/
source /tmp/util.sh# 继续main.sh中的其他命令
  1. 执行main.sh脚本。
./main.sh
  1. 执行完main.sh后,可以删除已解压的util.sh文件和tar.gz文件。
rm /tmp/util.sh /tmp/util.tar.gz

这样就可以在不将util.sh复制到远程计算机的情况下,成功运行main.sh并引用util.sh文件了。

相关文章:

在Shell脚本中通过ssh从脚本运行函数

文章目录 在Shell脚本中通过ssh从脚本运行函数declare -f 和typset -f&#xff0c;这两个命令有什么区别declare -f 和typset -f&#xff0c;这两个命令可以通过ssh运行脚本中的函数吗如果我有main.sh和util.sh&#xff0c;并且在main.sh中引用了util.sh&#xff0c;该怎么办&a…...

简单学习一下 MyBatis 动态SQL使用及原理

MyBatis 是一个优秀的持久层框架&#xff0c;它提供了丰富的 SQL 映射功能&#xff0c;可以让我们通过 XML 或注解方式来定义 SQL 语句。它很大程度上简化了数据库操作&#xff0c;提高了开发效率。动态 SQL 是其中一个非常重要的功能&#xff0c;可以让我们根据不同的条件动态…...

WhatsApp如何让客户参与变得更简单?

WhatsApp对你的品牌来说可能和Twitter和Facebook一样重要&#xff0c;你可能已经把它们纳入你的社交媒体战略。 是的&#xff0c;WhatsApp不仅仅可以用来给同事发短信或与远方的亲戚视频聊天&#xff0c;它也适用于商业。 在发展WhatsApp业务时&#xff0c;小企业主得到了最优…...

记一次 MySQL 主从同步异常的排查记录,百转千回

本文主要内容如下&#xff1a; 一、现象 最近项目的测试环境遇到一个主备同步的问题&#xff1a; 备库的同步线程停止了&#xff0c;无法同步主库的数据更改。 备库报错如下&#xff1a; 完整的错误信息&#xff1a; Relay log read failure: Could not parse relay log even…...

Cpython的多线程技术之痛

历史原因 在Python官网下载的默认解释器是采用C语言编写的Cpython解释器。在Python语言开发之初&#xff0c;计算机都是单核CPU&#xff0c;每个单核CPU同一时刻只能运行一个线程。为了模拟多线程工作&#xff0c;这里采用了模拟机制&#xff0c;让不同线程根据时间片段&#…...

NDK OpenGL离屏渲染与工程代码整合

NDK​系列之OpenGL离屏渲染与工程代码整合&#xff0c;本节主要是对上一节OpenGL渲染画面效果代码进行封装设计&#xff0c;将各种特效代码进行分离解耦&#xff0c;便于后期增加其他特效。 实现效果&#xff1a; 实现逻辑&#xff1a; 1.封装BaseFilter过滤器基类&#xff0c…...

Python基础入门编程代码练习(二)

一、求1~100之间不能被3整除的数之和 循环条件&#xff1a;i<100循环操作 实现代码如下&#xff1a; def sums():sum 0for num in range(1, 101):if num % 3 ! 0:sum numprint("1~100之间不能被3整除的数之和为&#xff1a;%s" % (sum))sums() print("1~…...

C# | 对象池

对象池 文章目录 对象池前言什么是对象池对象池的优点对象池的缺点 实现思路示例代码 结束语 前言 当我们开发一个系统或者应用程序时&#xff0c;我们通常需要创建很多的对象&#xff0c;这些对象可能是线程、内存、数据库连接、文件句柄等等。在某些情况下&#xff0c;我们需…...

CSS小技巧之圆形虚线边框

虚线相信大家日常都用的比较多&#xff0c;常见的用法就是使用 border-style 控制不同的样式&#xff0c;比如设置如下边框代码&#xff1a; border-style: dotted dashed solid double;这将设置顶部的边框样式为点状&#xff0c;右边的边框样式为虚线&#xff0c;底部的边框样…...

QString与QByteArray互相转换的方法

QString与QByteArray互相转换的方法 [1] QString与QByteArray互相转换的方法QString转QByteArray方法QByteArray转QString方法QByteArray类同样不以’\0’为结尾QByteArray转QString&#xff0c;主要用buf.toHex()即可 [2] Qt开发串口通讯软件中的数据转换问题1.读取串口命令-Q…...

Springboot +Flowable,设置流程变量的方式(一)

一.简介 为什么需要流程变量。 举个例子&#xff0c;假设有如下一个流程&#xff0c;截图如下&#xff1a; 这是一个请假流程&#xff0c;那么谁请假、请几天、起始时间、请假理由等等&#xff0c;这些都需要说明&#xff0c;不然领导审批的依据是啥&#xff1f;那么如何传递…...

机器学习13(正则化)

文章目录 简介正则化经验风险和结构风险过拟合正则化建模策略 逻辑回归逻辑回归评估器 练习评估器训练与过拟合实验评估器的手动调参 简介 这一节详细探讨关于正则化的相关内容&#xff0c;并就 sklearn 中逻辑回归&#xff08;评估器&#xff09;的参数进行详细解释由于 skle…...

并发编程学习(十一):原子数组、

1、数组类型的原子类 原子数组类型&#xff0c;这个其实和AtomicInteger等类似&#xff0c;只不过在修改时需要指明数组下标。 CAS是按照来根据地址进行比较。数组比较地址&#xff0c;肯定是不行的&#xff0c;只能比较下标元素。而比较下标元素&#xff0c;就和元素的…...

递归到动态规划:省去枚举行为

如果在动态规划的过程中没有枚举行为&#xff0c;那严格位置依赖和傻缓存的方式并没有太大区别&#xff0c;但是当有枚举行为的时候&#xff08;一个位置依赖于多个位置&#xff09;&#xff0c;那严格位置依赖是有优化空间的&#xff0c;枚举行为也许可以省去&#xff0c;题目…...

服务(第二十一篇)mysql高级查询语句(二)

①视图表&#xff1a; 视图表是虚拟表&#xff0c;用来存储SQL语句的定义 如果视图表和原表的字段相同&#xff0c;是可以进行数据修改的&#xff1b; 如果两者的字段不通&#xff0c;不可以修改数据。 语法&#xff1a; 创建&#xff1a;create view 试图表名 as ... 查…...

MYSQL高可用配置(MHA)

1、什么是MHA MHA&#xff08;Master High Availability&#xff09;是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 MHA 的出现就是解决MySQL 单点的问题。 MySQL故障切换过程中&#xff0c;MHA能做到0-30秒内自动完成故障切换操作。 MHA能在故障切换的过程中最大…...

单精度浮点数与十进制数据相互转换

一、float基础&#xff1a; Float类型占4个字节,也就是32bit,其中最高位是符号位,2~9位是指数位,后边的23bit是数值位.如下所示 大部分数据的二进制形式都可以用科学计数法表示,即1.m*2^n这种形式,只要知道m和n,就能确定一个数值 二、小数位如何转变为二进制&#xff1a; 下面…...

PMP敏捷-4大价值观、12原则

宣言及4大价值观 个体及互动 胜于 流程和工具 以人为本 工作的软件 胜于 完整的文档 以价值为导向 客户合作 胜于 合同谈判 合作共赢 应对变更 胜于 遵循计划 拥抱变化 12原则 工作原则&#xff1a;精益、至简&#xff0c;实现这种原则的方式是“定期反省”。9、10、12 …...

K8S—Helm

一、Helm介绍 helm通过打包的方式&#xff0c;支持发布的版本管理和控制&#xff0c;很大程度上简化了Kubernetes应用的部署和管理。 Helm本质就是让k8s的应用管理&#xff08;Deployment、Service等&#xff09;可配置&#xff0c;能动态生成。通过动态生成K8S资源清单文件&a…...

ALSA内部函数调用流程

ALSA内部函数调用流程 一直都有这样的一个疑问 就是在linux系统中我们调用snd_pcm_open后&#xff0c;就不知道alsa内部是怎么运行的了 用户的pcm_open()相当于先对ASoC各个驱动模块startup()&#xff0c;再做hw_params()。 pcm_open()pcm->fd open("/dev/snd/pcm…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...