使用 `Expect` 工具实现了自动化文件传输
通过 `scp` 命令将本地目录复制到远程服务器,并自动处理密码输入和确认连接提示。
### 脚本头部
```bash
#!/usr/bin/expect
```
指定脚本的解释器为 `Expect`,告诉系统使用 `Expect` 来执行此脚本。
### 设置超时时间
```bash
set timeout 30
```
设置超时时间为 30 秒。如果在 30 秒内没有收到期望的响应,脚本将退出并报错。
### 设置变量
```bash
set host "remote_host"
set user "username"
set password "your_password"
set local_dir "/path/to/local/dir"
set remote_dir "/path/to/remote/dir"
```
定义脚本中使用的变量:
- `host`:远程服务器的地址或主机名。
- `user`:登录远程服务器的用户名。
- `password`:登录远程服务器的密码。
- `local_dir`:本地要复制的目录路径。
- `remote_dir`:远程服务器上的目标目录路径。
### 启动 `scp` 进程
```bash
spawn scp -rp $local_dir $user@$host:$remote_dir
```
- `spawn`:`Expect` 命令,用于启动一个新的进程。
- `scp -rp`:`scp` 命令的选项 `-r` 表示递归复制目录,`-p` 表示保留文件权限和时间戳。
- `$local_dir $user@$host:$remote_dir`:`scp` 命令的参数,指定本地目录和远程目标路径。
### 处理交互式提示
```bash
expect {
"password:" { send "$password\r"; exp_continue }
"continue connecting (yes/no)?" { send "yes\r"; exp_continue }
}
```
- `expect`:`Expect` 命令,用于等待并匹配特定的输出。
- `"password:"`:匹配 `scp` 命令提示的密码输入。
- `send "$password\r"`:向 `scp` 进程发送密码,`\r` 表示回车。
- `exp_continue`:继续等待下一个匹配,不退出 `expect` 块。
- `"continue connecting (yes/no)?"`:匹配首次连接时可能出现的确认提示。
- `send "yes\r"`:发送 "yes" 并回车,确认连接。
### 等待进程结束
```bash
expect eof
```
- `expect eof`:等待 `scp` 进程结束,`eof` 表示 "End Of File",即进程结束的信号。
---
### 脚本总结
这个脚本通过 `Expect` 自动化了以下过程:
1. 启动 `scp` 命令进行文件传输。
2. 当出现密码提示时,自动输入预设的密码。
3. 当出现首次连接的确认提示时,自动回复 "yes"。
4. 等待文件传输完成并退出脚本。
这样,无需人工干预,即可实现自动化的安全文件传输。