在使用 expect
脚本与 scp
命令一起传输文件时,可能会遇到传输不完整数据的问题。这通常是由于 expect
脚本没有正确处理 scp
命令的交互过程。以下是一些常见的原因和解决方法:
expect
脚本正确处理密码提示expect
脚本需要正确处理 scp
命令的密码提示,以确保文件传输能够顺利进行。以下是一个示例 expect
脚本,展示如何处理 scp
命令的密码提示:
#!/usr/bin/expect
# 设置超时时间
set timeout -1
# 获取命令行参数
set password [lindex $argv 0]
set source_file [lindex $argv 1]
set destination [lindex $argv 2]
# 启动 scp 命令
spawn scp $source_file $destination
# 处理密码提示
expect {
"yes/no" {
send "yes\r"
exp_continue
}
"password:" {
send "$password\r"
}
}
# 等待 scp 命令完成
expect eof
expect
脚本正确处理所有交互有时,scp
命令可能会有其他交互提示,例如主机密钥验证。确保 expect
脚本能够处理这些提示:
#!/usr/bin/expect
# 设置超时时间
set timeout -1
# 获取命令行参数
set password [lindex $argv 0]
set source_file [lindex $argv 1]
set destination [lindex $argv 2]
# 启动 scp 命令
spawn scp $source_file $destination
# 处理交互提示
expect {
"yes/no" {
send "yes\r"
exp_continue
}
"password:" {
send "$password\r"
}
eof {
# 传输完成
}
timeout {
puts "Error: SCP command timed out"
exit 1
}
}
# 等待 scp 命令完成
expect eof
在传输完成后,检查文件的完整性,以确保文件传输没有中断或损坏。你可以使用 md5sum
或 sha256sum
等工具来验证文件的哈希值。
md5sum
验证文件完整性在源主机上计算文件的 MD5 哈希值:
md5sum source_file
在目标主机上计算传输后的文件的 MD5 哈希值:
md5sum destination_file
比较两个哈希值,确保它们相同。
rsync
替代 scp
如果问题仍然存在,可以考虑使用 rsync
替代 scp
。rsync
更加健壮,并且支持断点续传。以下是一个使用 expect
和 rsync
的示例:
#!/usr/bin/expect
# 设置超时时间
set timeout -1
# 获取命令行参数
set password [lindex $argv 0]
set source_file [lindex $argv 1]
set destination [lindex $argv 2]
# 启动 rsync 命令
spawn rsync -avz -e ssh $source_file $destination
# 处理密码提示
expect {
"yes/no" {
send "yes\r"
exp_continue
}
"password:" {
send "$password\r"
}
eof {
# 传输完成
}
timeout {
puts "Error: rsync command timed out"
exit 1
}
}
# 等待 rsync 命令完成
expect eof
领取专属 10元无门槛券
手把手带您无忧上云