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

如何写一个sh脚本将一个本地文件通过 scp命令上传到远程的 centos服务器?

如何写一个sh脚本将一个本地文件通过 scp命令上传到远程的 centos服务器?

    • 1.1 背景需求
    • 1.2 解决方案
    • 1.3 附录
      • 1.3.1 scp命令用法与示例
        • 1.3.1.1 scp命令用法与解释
        • 1.3.1.2 scp 命令用法示例
          • 1.3.1.2.1 示例一:从本地复制文件到远程计算机
          • 1.3.1.2.2 示例二:从远程计算机复制文件到本地
          • 1.3.1.2.3 示例三:递归复制整个目录到远程计算机
          • 1.3.1.2.4 示例四:从远程计算机下载整个目录到本地
      • 1.3.2 expect 命令用法与示例
        • 1.3.2.1 expect 基本用法
        • 1.3.2.2 expect 用法示例
          • 示例 1:自动登录 SSH
          • 示例 2:自动化 FTP 文件传输
          • 示例 3:交互式配置脚本

1.1 背景需求

这篇博文分享如何使用scpexpect命令写一个脚本来自动填充密码并实现自动登录并上传文件到服务器。

  • 假设目标服务器:192.168.159.175
  • 远程文件服务器登录账号假设是 root
  • 远程文件服务器登录密码假设是 toor
  • /Users/zhaoqingfeng/downloads/test/dist/ 是前端打包部署文件夹
  • /Users/zhaoqingfeng/downloads/test/dist/ 上传到 /var/www/html/your_project/ 目录下

1.2 解决方案

执行脚本输入如下命令:

sh publish.sh 

执行命令脚本内容如下:

#!/bin/bash# local host file folde path
local_dir="/Users/zhaoqingfeng/downloads/test/dist/"# config remote server info
# remote server ip
remote_server="192.168.159.175"
# config your remote server acccount
remote_user="root"
# config your remote server password
remote_password="toor"
# config remote server target path
remote_dir="/var/www/html/your_project/"# upload local file to remote server
expect -c "
spawn scp -r $local_dir $remote_user@$remote_server:$remote_dir
expect {\"*assword:\" {send \"$remote_password\r\"exp_continue}\"yes/no\" {send \"yes\r\"exp_continue}eof
}
"# Check scp command
if [ $? -eq 0 ]; thenecho "Upload file success!"
elseecho "File upload fail"
fi

脚本含义详细解释:

  • 在这个脚本中,使用expect来处理自动登录并上传文件。
    expect -c "...":这是Expect的命令行工具,它允许您在命令行中执行Expect脚本。
    • 在这个命令中,整个Expect脚本被包含在引号内。
  • spawn scp -r $local_dir $remote_user@$remote_server:$remote_dir
    • 这一行使用spawn命令启动了一个新的进程,该进程执行scp命令来将本地目录(或文件)$local_dir传输到远程服务器$remote_server的指定目录$remote_dir
    • -r选项表示递归地复制目录。
      expect {...}:这是Expect脚本的主体,它定义了脚本的行为,根据不同的情况采取不同的操作。
    • "*assword:":这是一个Expect匹配模式(pattern),它用来匹配scp命令执行时可能出现的提示,通常是要求输入密码的提示。*通配符表示匹配任何字符,因此它可以匹配包含"assword:"的任何提示。
    • send "$remote_password\r":当匹配到密码提示时,脚本会使用send命令发送远程密码$remote_passwordscp命令。
    • \r表示回车键,以便输入密码后模拟按下回车键来提交密码。
    • exp_continue:这个命令告诉Expect继续等待并匹配下一个条件。在这种情况下,它会一直等待,直到出现新的匹配条件。
    • "yes/no":这是另一个匹配模式,用于处理SSH连接时可能出现的确认远程主机的提示,通常是在首次连接时出现的。
    • send "yes\r":当匹配到"yes/no"提示时,脚本会自动发送"yes"来确认连接。
    • eof:这个条件匹配到远程scp命令执行结束,即传输完成,并且脚本可以退出。

总体来说就是

  • 使用scp -r 命令递归遍历 /Users/zhaoqingfeng/downloads/test/dist/目录下的所有文件后都上传
  • 它会等待密码提示或是否信任主机的提示,并自动填充密码或发送"yes"以完成操作。
  • 最后,检查scp命令的退出状态以确定上传是否成功。确保将remote_password替换为实际的远程服务器密码。

最后执行成功如下所示:
在这里插入图片描述

1.3 附录

1.3.1 scp命令用法与示例

1.3.1.1 scp命令用法与解释

scp 命令是用于在本地计算机和远程计算机之间进行安全文件传输的工具。

它可以用来上传或下载文件和目录。以下是 scp 命令的基本用法和解释:

scp [options] source_file/directory target_file/directory

scp: 是 Secure Copy 的缩写,用于进行安全的文件复制。

  • options: 可以是一些标志,用于自定义传输行为。一些常见的选项包括:
    • -r:递归复制,用于复制目录及其内容。
    • -P <端口号>:指定远程 SSH 服务器的端口号。
    • -i <身份验证密钥文件>:指定身份验证密钥文件。
    • -v:详细模式,显示详细的传输信息。
  • source_file/directory: 指定要传输的文件或目录的路径。这可以是本地文件系统上的路径或远程计算机上的路径。如果是远程路径,通常以 <用户名>@<远程主机>:<路径> 的格式指定。
  • target_file/directory: 指定传输的目标位置。与源相似,可以是本地或远程路径。

1.3.1.2 scp 命令用法示例

以下是一些示例 scp 命令用法:

1.3.1.2.1 示例一:从本地复制文件到远程计算机
scp localfile.txt user@remotehost:/remote/directory/
1.3.1.2.2 示例二:从远程计算机复制文件到本地
scp user@remotehost:/remote/file.txt /local/directory/
1.3.1.2.3 示例三:递归复制整个目录到远程计算机
scp -r local_directory/ user@remotehost:/remote/directory/
1.3.1.2.4 示例四:从远程计算机下载整个目录到本地
scp -r user@remotehost:/remote/directory/ /local/directory/
  • 这些示例演示了 scp 命令的基本用法,可以根据需要使用不同的选项和参数来满足具体的文件传输需求。
  • 需要注意的是,scp 使用 SSH 协议来保证传输的安全性,因此需要在远程主机上启用 SSH 服务。

1.3.2 expect 命令用法与示例

  • expect 是一个用于自动化交互式任务的命令行工具,它允许你编写脚本来模拟用户输入和对命令行程序的预期输出做出响应。
  • 通常用于自动化任务、测试和自动化配置。

下面是 expect 命令的一些基本用法和示例:

1.3.2.1 expect 基本用法

expect 命令的基本语法如下:

expect [选项] <期望模式> <动作>

选项:可以包括一些常见的选项,如 -c 用于指定要执行的 expect 脚本代码。

<期望模式>:这是一个正则表达式,用于匹配命令行程序的输出,以确定下一步的操作。

<动作>:这是要执行的命令或操作,通常是响应匹配到的输出。

1.3.2.2 expect 用法示例

以下是一些 expect 命令的示例:

示例 1:自动登录 SSH
#!/usr/bin/expect
set timeout 10
spawn ssh user@hostname
expect "password:"
send "your_password\r"
expect "$"
send "ls -l\r"
expect "$"
send "exit\r"
  • 在这个示例中,expect 脚本模拟了 SSH 登录。
  • 它启动 SSH 连接,等待看到 “password:”,
  • 然后发送密码, 接着等待 “$” 提示符,发送了一个 “ls -l” 命令,
  • 最后发送 “exit” 退出 SSH 会话。
示例 2:自动化 FTP 文件传输
#!/usr/bin/expect
set timeout 10
spawn ftp ftp.example.com
expect "Name (ftp.example.com:user):"
send "your_username\r"
expect "Password:"
send "your_password\r"
expect "ftp>"
send "put localfile.txt remotefile.txt\r"
expect "ftp>"
send "quit\r"
  • 这个示例展示了如何使用 expect 自动化 FTP 文件传输。
  • 它启动了一个 FTP 会话,输入用户名和密码,
  • 然后上传一个本地文件到远程服务器。
示例 3:交互式配置脚本
#!/usr/bin/expect
set timeout 10
spawn ./configure.sh
expect "Enter your name:"
send "Your Name\r"
expect "Enter your email:"
send "your@email.com\r"
expect "Choose an option (1/2/3):"
send "2\r"
expect eof
  • 在这个示例中,expect 脚本模拟了一个交互式配置脚本的用户输入。
  • 它运行一个名为 configure.sh 的脚本,
  • 然后模拟了用户对一系列问题的响应。

相关文章:

如何写一个sh脚本将一个本地文件通过 scp命令上传到远程的 centos服务器?

如何写一个sh脚本将一个本地文件通过 scp命令上传到远程的 centos服务器&#xff1f; 1.1 背景需求1.2 解决方案1.3 附录1.3.1 scp命令用法与示例1.3.1.1 scp命令用法与解释1.3.1.2 scp 命令用法示例1.3.1.2.1 示例一&#xff1a;从本地复制文件到远程计算机1.3.1.2.2 示例二&a…...

【CMake工具】工具CMake编译轻度使用(C/C++)

目录 CMake编译工具 一、CMake概述 二、CMake的使用 2.1 注释 2.1.1 注释行 2.1.2 注释块 2.2 源文件 2.1.1 共处一室 2.1.2 VIP包房 2.3 私人定制 2.2.1 定义变量 2.2.2 指定使用的C标准 2.2.3 指定输出的路径 2.4 搜索文件 2.3.1 方式1 2.3.2 方式2 2.5 包含…...

用Navicat备份Mysql演示系统数据库的时候出:Too Many Connections

今天用Navicat进行数据备份的时候&#xff0c;发现由于数据库连接数目过多导致连接锁定&#xff0c;这种情况在多人协同开发的场景中很常见。当然我这里也因为多个应用使用了数据库连接&#xff0c;所以出现了Too Many Connections。 可能是超过最大连接数了。 1、进入Navicat…...

知识储备--基础算法篇-矩阵

2.矩阵 2.1第54题螺旋矩阵 第一题上来就跪了&#xff0c;看了官方答案感觉不是很好理解&#xff0c;找了一个比较容易理解的。 class Solution(object):def spiralOrder(self, matrix):""":type matrix: List[List[int]]:rtype: List[int]"""…...

Zabbix -- QQ邮箱报警

目录 一、创建监控项及触发器 1.1创建监控项 1.2 创建监控项的触发器 1.3 测试触发器 二、邮箱媒介设置 2.1 设置报警媒介类型 2.2 创建用户群组和用户 三、动作绑定 3.1 创建动作 3.2 动作操作 3.3 动作测试&#xff08;发送邮件测试&#xff09; 四、问题总结 4.1 邮件发送…...

eclipse链接MySQL数据库

在MySQL官网下载驱动 MySQLhttps://www.mysql.com/cn/点击下载&#xff1a; 页面滚动到最下方选择社区版&#xff1a; 选择Java版本: 接下来&#xff0c;需要选择操作系统&#xff0c;我们选择平台独立&#xff1a; eclipse 接下来&#xff0c;我们打开eclipse&#xff0c;新建…...

ansible 使用roles简单部署LAMP平台

目录 一、了解roles目录 二、基于构建LAMP平台创建roles目录 1、在192.168.115.148创建目录 2、书写php的测试页面 3、编写httpd角色的main.yml文件 4、编写mysql角色的main.yml文件 6、编写lamp的playbook 7、启动剧本 8、访问 一、了解roles目录 在Ansible中&#…...

如何使用Web Storage对页面中数据进行监听?

当使用Web Storage存储的数据发生变化时&#xff0c;会触发Window对象的storage事件&#xff0c;我们可以监听该事件并指定事件处理函数&#xff0c;当其他页面中的localStorage或 sessionStorage中保存的数据发生改变时&#xff0c;就会执行事件处理函数。 监听storage事件的…...

GO语言网络编程(并发编程)runtime包

GO语言网络编程&#xff08;并发编程&#xff09;runtime包 1. runtime包 1.1.1. runtime.Gosched() 让出CPU时间片&#xff0c;重新等待安排任务(大概意思就是本来计划的好好的周末出去烧烤&#xff0c;但是你妈让你去相亲,两种情况第一就是你相亲速度非常快&#xff0c;见…...

MR源码解析和join案例

MR源码解析 new Job(): 读取本地文件, xml配置job.start(): 启动线程job的run():线程方法 runTasks(): 传入对应的接口&#xff0c;启动map或者reduceMapTask类的run(): 设置map阶段的参数&#xff0c;初始化任务&#xff0c;创建上下文对象 创建读取器LineRecordReader判断是…...

ML+LLMs:利用LLMs大语言模型赋能或者结合ML机器学习算法进行具体应用的简介、具体案例之详细攻略

ML+LLMs:利用LLMs大语言模型赋能或者结合ML机器学习算法进行具体应用的简介、具体案例之详细攻略 目录 利用LLMs赋能或者结合ML算法进行具体应用的简介...

python GIL锁

1、GIL是什么 GIL&#xff1a;Global Interpreter Lock又称全局解释器锁。简单来说是一个互斥锁&#xff0c;每个线程在执行的过程中都需要先获取GIL&#xff0c;作用就是限制多线程同时执行&#xff0c;使得在同一进程内任何时刻仅有一个线程在执行。 由于GIL的存在&#xff0…...

git打tag和版本控制规范

我们在开发中经常会遇到要打tag的情况&#xff0c;但这个tag应该如何打呢&#xff1f;我不知道大家平时是怎么打的&#xff0c;但我基本就是从1.0.0开始进行往上递增&#xff0c;至于如何递增&#xff0c;基本凭感觉。今天同事新打了一个tag进行发版&#xff0c;然后被架构点名…...

php版 短信跳转微信小程序

实现这功能首先&#xff0c;小程序端添加业务域名 php代码 <?php declare (strict_types1);namespace app\controller\Admin;use app\model\Set; use app\Request;class Admin_Url_Scheme {public function getScheme(Request $request) {$appid 小程序appid;$secret 小…...

leetcode127单词接龙刷题打卡

127. 单词接龙 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk&#xff1a; 每一对相邻的单词只差一个字母。对于 1 < i < k 时&#xff0c;每个 si 都在 wordList 中。注意&am…...

基于SSM的物流管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…...

EagleSDR USB HAT FT600

给EagleSDR做了个USB 3.0的子卡&#xff0c;采用FT600方案&#xff0c;实物如下&#xff1a; 用FT600DataStreamerDemoApp测试&#xff0c;速度如下&#xff1a; 由于FT600是16bit的接口&#xff0c;如果用FT601的32bit接口&#xff0c;性能应该还会有大幅提升。 测试代码很简…...

Java多线程(四)锁策略(CAS,死锁)和多线程对集合类的使用

锁策略&#xff08;CAS&#xff0c;死锁&#xff09;和多线程对集合类的使用 锁策略 1.乐观锁VS悲观锁 2.轻量级锁VS重量级锁 3.自旋锁VS挂起等待锁 4.互斥锁VS读写锁 5.可重入锁vs不可重入锁 死锁的第一种情况 死锁的第二种情况 死锁的第三种情况 CAS 1.实现原子类 …...

基于spring boot+ vue+ mysql开发的UWB室内外定位系统源码

现代制造业厂区面积大、人员数量多、物资设备不断增加&#xff0c;随着工业信息化技术的发展&#xff0c;大型制造企业中对人员、车辆、物资的管理要求越来越细致。 高精度定位管理系统使用UWB室内定位技术&#xff0c;通过在厂区安装定位基站&#xff0c;为人员或设备佩戴定位…...

第2章_瑞萨MCU零基础入门系列教程之面向过程与面向对象

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

MMaDA: Multimodal Large Diffusion Language Models

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

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

解读《网络安全法》最新修订,把握网络安全新趋势

《网络安全法》自2017年施行以来&#xff0c;在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂&#xff0c;网络攻击、数据泄露等事件频发&#xff0c;现行法律已难以完全适应新的风险挑战。 2025年3月28日&#xff0c;国家网信办会同相关部门起草了《网络安全…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...