如何写一个sh脚本将一个本地文件通过 scp命令上传到远程的 centos服务器?
-
- [1.1 背景需求](#1.1 背景需求)
- [1.2 解决方案](#1.2 解决方案)
- [1.3 附录](#1.3 附录)
-
- [1.3.1 scp命令用法与示例](#1.3.1 scp命令用法与示例)
-
- [1.3.1.1 scp命令用法与解释](#1.3.1.1 scp命令用法与解释)
- [1.3.1.2 scp 命令用法示例](#1.3.1.2 scp 命令用法示例)
-
- [1.3.1.2.1 示例一:从本地复制文件到远程计算机](#1.3.1.2.1 示例一:从本地复制文件到远程计算机)
- [1.3.1.2.2 示例二:从远程计算机复制文件到本地](#1.3.1.2.2 示例二:从远程计算机复制文件到本地)
- [1.3.1.2.3 示例三:递归复制整个目录到远程计算机](#1.3.1.2.3 示例三:递归复制整个目录到远程计算机)
- [1.3.1.2.4 示例四:从远程计算机下载整个目录到本地](#1.3.1.2.4 示例四:从远程计算机下载整个目录到本地)
- [1.3.2 expect 命令用法与示例](#1.3.2 expect 命令用法与示例)
-
- [1.3.2.1 expect 基本用法](#1.3.2.1 expect 基本用法)
- [1.3.2.2 expect 用法示例](#1.3.2.2 expect 用法示例)
-
- [示例 1:自动登录 SSH](#示例 1:自动登录 SSH)
- [示例 2:自动化 FTP 文件传输](#示例 2:自动化 FTP 文件传输)
- [示例 3:交互式配置脚本](#示例 3:交互式配置脚本)
1.1 背景需求
这篇博文分享如何使用scp
和expect
命令写一个脚本来自动填充密码并实现自动登录并上传文件到服务器。
- 假设目标服务器:
192.168.159.175
- 远程文件服务器登录账号假设是
root
- 远程文件服务器登录密码假设是
toor
/Users/zhaoqingfeng/downloads/test/dist/
是前端打包部署文件夹- 将
/Users/zhaoqingfeng/downloads/test/dist/
上传到/var/www/html/your_project/
目录下
1.2 解决方案
执行脚本输入如下命令:
bash
sh publish.sh
执行命令脚本内容如下:
bash
#!/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 ]; then
echo "Upload file success!"
else
echo "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_password
给scp
命令。\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 命令的基本用法和解释:
bash
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 示例一:从本地复制文件到远程计算机
bash
scp localfile.txt user@remotehost:/remote/directory/
1.3.1.2.2 示例二:从远程计算机复制文件到本地
bash
scp user@remotehost:/remote/file.txt /local/directory/
1.3.1.2.3 示例三:递归复制整个目录到远程计算机
bash
scp -r local_directory/ user@remotehost:/remote/directory/
1.3.1.2.4 示例四:从远程计算机下载整个目录到本地
bash
scp -r user@remotehost:/remote/directory/ /local/directory/
- 这些示例演示了 scp 命令的基本用法,可以根据需要使用不同的选项和参数来满足具体的文件传输需求。
- 需要注意的是,scp 使用 SSH 协议来保证传输的安全性,因此需要在远程主机上启用 SSH 服务。
1.3.2 expect 命令用法与示例
expect
是一个用于自动化交互式任务的命令行工具,它允许你编写脚本来模拟用户输入和对命令行程序的预期输出做出响应。- 通常用于自动化任务、测试和自动化配置。
下面是 expect 命令的一些基本用法和示例:
1.3.2.1 expect 基本用法
expect 命令的基本语法如下:
bash
expect [选项] <期望模式> <动作>
选项:可以包括一些常见的选项,如 -c 用于指定要执行的 expect 脚本代码。
<期望模式>:这是一个正则表达式,用于匹配命令行程序的输出,以确定下一步的操作。
<动作>:这是要执行的命令或操作,通常是响应匹配到的输出。
1.3.2.2 expect 用法示例
以下是一些 expect 命令的示例:
示例 1:自动登录 SSH
bash
#!/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 文件传输
bash
#!/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:交互式配置脚本
bash
#!/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 的脚本,
- 然后模拟了用户对一系列问题的响应。