在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.sh
和util.sh
,并且在main.sh
中引用了util.sh
,该怎么办? 我应该如何通过ssh执行main.sh
而不将utils.sh
复制到远程计算机?
使用declare -f
或typset -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 都是用来查看函数定义的命令,
但是它们具有不同的作用和输出形式:
declare -f function_name
declare -f
命令用于显示指定函数的定义(包括函数名、参数和函数体)。如果没有指定函数名称,则显示所有已定义的函数。
示例代码:
# 定义函数
function hello() {echo "Hello, world!"
}# 使用 declare -f 输出函数定义
declare -f hello# 输出结果为:
# hello ()
# {
# echo "Hello, world!"
# }# 不传递函数名称,显示所有已定义的函数
declare -f
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 -f
和 type -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远程执行命令来完成此操作。具体步骤如下:
- 在本地计算机上,将util.sh压缩为tar.gz文件,例如:
tar -czf util.tar.gz util.sh
- 使用scp命令将util.tar.gz文件复制到远程计算机上,例如:
scp util.tar.gz remoteuser@remotehost:/tmp/
其中remoteuser是远程计算机上的用户名,remotehost是远程计算机的地址,/tmp/是目标文件夹。
-
在远程计算机上,通过ssh连接到该计算机,并切换到main.sh所在的目录。
-
解压缩util.tar.gz文件,并在main.sh中引用util.sh文件。例如:
tar -xzf /tmp/util.tar.gz -C /tmp/
source /tmp/util.sh# 继续main.sh中的其他命令
- 执行main.sh脚本。
./main.sh
- 执行完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,这两个命令有什么区别declare -f 和typset -f,这两个命令可以通过ssh运行脚本中的函数吗如果我有main.sh和util.sh,并且在main.sh中引用了util.sh,该怎么办&a…...
简单学习一下 MyBatis 动态SQL使用及原理
MyBatis 是一个优秀的持久层框架,它提供了丰富的 SQL 映射功能,可以让我们通过 XML 或注解方式来定义 SQL 语句。它很大程度上简化了数据库操作,提高了开发效率。动态 SQL 是其中一个非常重要的功能,可以让我们根据不同的条件动态…...

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

记一次 MySQL 主从同步异常的排查记录,百转千回
本文主要内容如下: 一、现象 最近项目的测试环境遇到一个主备同步的问题: 备库的同步线程停止了,无法同步主库的数据更改。 备库报错如下: 完整的错误信息: Relay log read failure: Could not parse relay log even…...
Cpython的多线程技术之痛
历史原因 在Python官网下载的默认解释器是采用C语言编写的Cpython解释器。在Python语言开发之初,计算机都是单核CPU,每个单核CPU同一时刻只能运行一个线程。为了模拟多线程工作,这里采用了模拟机制,让不同线程根据时间片段&#…...

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

Python基础入门编程代码练习(二)
一、求1~100之间不能被3整除的数之和 循环条件:i<100循环操作 实现代码如下: def sums():sum 0for num in range(1, 101):if num % 3 ! 0:sum numprint("1~100之间不能被3整除的数之和为:%s" % (sum))sums() print("1~…...

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

CSS小技巧之圆形虚线边框
虚线相信大家日常都用的比较多,常见的用法就是使用 border-style 控制不同的样式,比如设置如下边框代码: border-style: dotted dashed solid double;这将设置顶部的边框样式为点状,右边的边框样式为虚线,底部的边框样…...
QString与QByteArray互相转换的方法
QString与QByteArray互相转换的方法 [1] QString与QByteArray互相转换的方法QString转QByteArray方法QByteArray转QString方法QByteArray类同样不以’\0’为结尾QByteArray转QString,主要用buf.toHex()即可 [2] Qt开发串口通讯软件中的数据转换问题1.读取串口命令-Q…...

Springboot +Flowable,设置流程变量的方式(一)
一.简介 为什么需要流程变量。 举个例子,假设有如下一个流程,截图如下: 这是一个请假流程,那么谁请假、请几天、起始时间、请假理由等等,这些都需要说明,不然领导审批的依据是啥?那么如何传递…...

机器学习13(正则化)
文章目录 简介正则化经验风险和结构风险过拟合正则化建模策略 逻辑回归逻辑回归评估器 练习评估器训练与过拟合实验评估器的手动调参 简介 这一节详细探讨关于正则化的相关内容,并就 sklearn 中逻辑回归(评估器)的参数进行详细解释由于 skle…...
并发编程学习(十一):原子数组、
1、数组类型的原子类 原子数组类型,这个其实和AtomicInteger等类似,只不过在修改时需要指明数组下标。 CAS是按照来根据地址进行比较。数组比较地址,肯定是不行的,只能比较下标元素。而比较下标元素,就和元素的…...

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

服务(第二十一篇)mysql高级查询语句(二)
①视图表: 视图表是虚拟表,用来存储SQL语句的定义 如果视图表和原表的字段相同,是可以进行数据修改的; 如果两者的字段不通,不可以修改数据。 语法: 创建:create view 试图表名 as ... 查…...

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

单精度浮点数与十进制数据相互转换
一、float基础: Float类型占4个字节,也就是32bit,其中最高位是符号位,2~9位是指数位,后边的23bit是数值位.如下所示 大部分数据的二进制形式都可以用科学计数法表示,即1.m*2^n这种形式,只要知道m和n,就能确定一个数值 二、小数位如何转变为二进制: 下面…...
PMP敏捷-4大价值观、12原则
宣言及4大价值观 个体及互动 胜于 流程和工具 以人为本 工作的软件 胜于 完整的文档 以价值为导向 客户合作 胜于 合同谈判 合作共赢 应对变更 胜于 遵循计划 拥抱变化 12原则 工作原则:精益、至简,实现这种原则的方式是“定期反省”。9、10、12 …...

K8S—Helm
一、Helm介绍 helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理。 Helm本质就是让k8s的应用管理(Deployment、Service等)可配置,能动态生成。通过动态生成K8S资源清单文件&a…...
ALSA内部函数调用流程
ALSA内部函数调用流程 一直都有这样的一个疑问 就是在linux系统中我们调用snd_pcm_open后,就不知道alsa内部是怎么运行的了 用户的pcm_open()相当于先对ASoC各个驱动模块startup(),再做hw_params()。 pcm_open()pcm->fd open("/dev/snd/pcm…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

stm32wle5 lpuart DMA数据不接收
配置波特率9600时,需要使用外部低速晶振...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...