如何写一个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 的脚本,
  • 然后模拟了用户对一系列问题的响应。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/100523.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-select下拉多选框 el-select 设置默认值不可删除功能

Element3.0vue3.0 el-select下拉多选框 el-select 设置默认值不可删除功能 Element-UI是一款广泛使用的Vue.js组件库&#xff0c;其中El-Select下拉多选框组件在实际项目开发中经常被使用。然而&#xff0c;在Element 3.0版本中&#xff0c;El-Select下拉多选框默认值可被删除&…

Unity——LitJSON的安装

一、LitJSON介绍 特点 LitJSON是一个轻量级的C# JSON库&#xff0c;用于在Unity游戏开发中进行JSON数据的序列化和反序列化操作。它提供了简单而高效的接口&#xff0c;帮助开发者处理JSON数据。 以下是LitJSON库的一些主要特点和功能&#xff1a; 1. 高性能&#xff1a;Lit…

Qt应用开发(基础篇)——复选按钮 QCheckBox 单选按钮 QRadioButton

一、前言 QCheckBox类与QRadioButton类继承于QAbstractButton&#xff0c;QCheckBox是一个带有文本标签的复选框&#xff0c;QRadioButton是一个带有文本标签的单选按钮。 按钮基类 QAbstractButton QCheckBox QCheckBox复选框是一个很常用的控件&#xff0c;拥有开关(选中和未…

Elasticsearch脑裂

文章目录 Elasticsearch脑裂 Elasticsearch脑裂 Elasticsearch脑裂是指由于网络分区或节点间通信故障导致集群中的节点无法互相正常通信&#xff0c;从而导致数据不一致的情况。这可能会导致集群中的多个节点同时自认为是主节点&#xff08;master&#xff09;&#xff0c;并开…

库的相关操作

目录 一、创建数据库 1&#xff0c;创建数据库规则 2、创建案例 二、字符集和校验规则 1、查看系统默认字符集以及校验规则 2、查看数据库支持的字符集以及校验规则 3、校验规则对数据库的影响 三、操纵数据库 1、查看数据库和目前所在数据库 2、显示创建语句 3、修改数据库 4、…

NPM 常用命令(四)

目录 1、npm diff 1.1 描述 1.2 过滤文件 1.3 配置 diff diff-name-only diff-unified diff-ignore-all-space diff-no-prefix diff-src-prefix diff-dst-prefix diff-text global tag workspace workspaces include-workspace-root 2、npm dist-tag 2.1 常…

【gtpJavaScript】使用JavaScript实现套壳gtp与gtp打字输出效果

postman测试gtp接口 https://platform.openai.com/docs/api-reference/chat/create?langcurl 导入到postman中 记得弄一个gtp的key 然后请求测试gtp接口&#xff1a; 纯前端实现gtp请求页面 目录结构&#xff1a; 部分参考&#xff1a;GitHub - xxxjkk/chat-website: 简易版c…

maven管理android项目

maven管理android项目 1.安装maven-android-sdk-deployer&#xff0c;下载地址&#xff1a;https://github.com/mosabua/maven-android-sdk-deployer 2.解压缩大英文路径文件夹 3.在压缩后的根目录执行mvn clean install -P 2.3.3&#xff08;2.3.3指的是android版本号&#x…

找redis大key工具rdb_bigkeys

github官网 https://github.com/weiyanwei412/rdb_bigkeys 在centos下安装go [roothadoop102 rdb_bigkeys-master]# wget https://dl.google.com/go/go1.13.5.linux-amd64.tar.gz [roothadoop102 rdb_bigkeys-master]# tar -zxf go1.13.5.linux-amd64.tar.gz -C /usr/local将g…

[ROS]虚拟机ubuntu18.04系统里面运行usb_cam

首先安装usb_cam sudo apt-get install ros-melodic-usb-cam 运行&#xff1a; roscore roslaunch usb_cam usb_cam-test.launch 如果一运行报错&#xff0c;首先确认是否存在/dev/video0 可以使用ls /dev/video*查看&#xff0c;如果没有就是没有连接摄像头&#xff0c;…

简单使用_matlab生成数据帧

文章目录 生成数据帧参考 生成数据帧 代码如下&#xff0c;代码很简单&#xff0c;有几点要注意&#xff0c; 较高版本的MATLAB中支持0x的写法使用bitand进行位运算使用strcat函数进行字符串拼接时&#xff0c;如果需要插入空格&#xff0c;要使用双引号 cmd_ay(1) 0x33; …

《人生苦短,我学Python》——条件判断->(if-elif-else)多向选择 条件嵌套

今天&#xff0c;我们来学习多向选择&#xff01;if--elif--else if 后的语句是当 if 判断条件成立时&#xff0c;执行的操作。elif 后的语句是当 if 判断不成立时&#xff0c;再判断一次&#xff0c;如果成立&#xff0c;执行的操作。else 后的语句是当以上所有判断条件都不成…