当前位置: 首页 > 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…...

Python正则表达式详解,保姆式教学,0基础也能掌握正则

正则作为处理字符串的一个实用工具&#xff0c;在Python中经常会用到&#xff0c;比如爬虫爬取数据时常用正则来检索字符串等等。正则表达式已经内嵌在Python中&#xff0c;通过导入re模块就可以使用&#xff0c;作为刚学Python的新手大多数都听说”正则“这个术语。 今天来给…...

ChatGPT 接入飞书教程,创建自己的聊天机器人

ChatGPT 接入飞书教程,创建自己的聊天机器人 一、飞书进入开发者平台。点击创建应用。二、打开Aircode,点击创建应用,上面输入名字,下面选择Node.js v16三、配置环境,点击Environments,创建四个变量,全部要大写本教程收集于: AIGC从入门到精通教程 首先,准备三个账号…...

JS生成随机数(多种解决方案)

JS生成随机数 概述 随机数是编程语言中的重要组成部分。在JavaScript中&#xff0c;生成随机数是一项简单的任务。本文将介绍生成随机数的各种方法。 Math.random() Math.random()是JavaScript中生成随机数最常见的方法。该方法返回介于0和1之间的随机数。例如&#xff0c;…...

文件IO 函数 静态库和动态库的创建 5.11

5.11 文件IO函数 1.数据读写 ssize_t read(int fd,void *buf,size_t count); 功能&#xff1a; ​ 从fd对应的文件中 读取前count个字节的数据到buf缓冲区中 头文件&#xff1a; ​ #include <unistd.h> 参数&#xff1a; ​ fd &#xff1a;文件描述符 ​ buf…...

考研日语-详解ている、てある、ていく、てくる用法

目录 一、ている用法 1. 表示现在状态 2. 表示持续动作 3. 表示经验或习惯 4. 表示结果或效果 二、てある用法 1. 表示已经完成的动作 2. 表示现在状态 3. 表示被动 三、ていく用法 1. 表示未来的动作 2. 表示逐渐变化的过程 四、てくる用法 1. 表示过去到现在的…...

Spring Security 6.x 系列【36】授权服务器篇之OpenID Connect 1.0

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 本系列Spring Authorization Server 版本 1.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录 1. 前言2. OpenID Connect…...

【计算机视觉 | Pytorch】timm 包的具体介绍和图像分类案例(含源代码)

一、具体介绍 timm 是一个 PyTorch 原生实现的计算机视觉模型库。它提供了预训练模型和各种网络组件&#xff0c;可以用于各种计算机视觉任务&#xff0c;例如图像分类、物体检测、语义分割等等。 timm 的特点如下&#xff1a; PyTorch 原生实现&#xff1a;timm 的实现方式…...

轻博客Plume的搭建

什么是 Plume &#xff1f; Plume 是一个基于 ActivityPub 的联合博客引擎。它是用 Rust 编写的&#xff0c;带有 Rocket 框架&#xff0c;以及 Diesel 与数据库交互。前端使用 Ructe模板、WASM 和SCSS。 反向代理 假设我们实际访问地址为&#xff1a; https://plume.laosu.ml…...

机器人关节电机PWM

脉冲宽度调制(Pulse width modulation,PWM)技术。一种模拟控制方式 机器人关节电机的控制通常使用PWM(脉冲宽度调制)技术。PWM是一种用于控制电子设备的技术,通过控制高电平和低电平之间的时间比例,实现对电子设备的控制。在机器人关节电机中,PWM信号可以控制电机的…...

MPU6050详解(含源码)

前言&#xff1a;MPU6050是一款强大的六轴传感器&#xff0c;需要理解MPU6050首先得有IIC的基础&#xff0c;MPU6050 内部整合了 3 轴陀螺仪和 3 轴加速度传感器&#xff0c;并且含有一个第二 IIC 接口&#xff0c;可用于连接外部磁力传感器&#xff0c;内部有硬件算法支持. 1…...