检查远程文件是否存在并在 expect 脚本中执行一些其他操作
Check if remote file exist and perform some other operation in expect script
我正在尝试在 Linux 中编写一个需要执行以下工作的期望脚本。
- 使用 ssh
登录远程 windows 机器
- 检查某个文件是否存在
- 比较同一路径上另一个文件的时间戳,如果更新则打印
在第 1 步中,我尝试发送一个命令来检查文件是否存在,但它不起作用
log_user 1
spawn ssh -o "StrictHostKeyChecking=no" $username@$hostname
expect {
..... user and password checks
.....
send "IF EXIST C:\path\to\file\temp.zip (echo FOUND) else (echo NOTFOUND)\r"
expect "path" {
set result $expect_out(buffer)
puts $result
if{$result=="FOUND"} {
#compare with temp2.zip here
}
}
结果始终包含我发送的命令,而不是输出 FOUND 或 NOTFOUND。有人可以让我知道我在这里做错了什么吗?
您的脚本尝试手动处理缓冲区而不是使用模式匹配,但错误地假设缓冲区将仅包含文本“(NOT)FOUND”。该缓冲区实际上将包含自上次使用命令 expect
以来收到的所有内容。即使它确实与缓冲区正确匹配(例如,使用 string match *NOTFOUND* $result
),它也会受到 the echo problem 的影响:字符串 "FOUND" 和 "NOTFOUND" 在命令中发送,这很可能是由 SSH 服务器回显给您的。
脚本的以下修改通过不发送它期望的文字字符串来绕过回声问题。
它适用于 Windows 端的 Bitvise SSH 服务器。
log_user 1
spawn ssh -o "StrictHostKeyChecking=no" $username@$hostname
# Log in here.
send "set prefix=___\r" ;# Combat the echo problem.
send "IF EXIST C:\path\to\file\temp.zip (echo %prefix%FOUND) else (echo %prefix%NOTFOUND)\r"
expect {
___NOTFOUND {
error {file not found}
}
___FOUND {
send_user Found!\n
# Do things with the file.
}
}
我正在尝试在 Linux 中编写一个需要执行以下工作的期望脚本。
- 使用 ssh 登录远程 windows 机器
- 检查某个文件是否存在
- 比较同一路径上另一个文件的时间戳,如果更新则打印
在第 1 步中,我尝试发送一个命令来检查文件是否存在,但它不起作用
log_user 1
spawn ssh -o "StrictHostKeyChecking=no" $username@$hostname
expect {
..... user and password checks
.....
send "IF EXIST C:\path\to\file\temp.zip (echo FOUND) else (echo NOTFOUND)\r"
expect "path" {
set result $expect_out(buffer)
puts $result
if{$result=="FOUND"} {
#compare with temp2.zip here
}
}
结果始终包含我发送的命令,而不是输出 FOUND 或 NOTFOUND。有人可以让我知道我在这里做错了什么吗?
您的脚本尝试手动处理缓冲区而不是使用模式匹配,但错误地假设缓冲区将仅包含文本“(NOT)FOUND”。该缓冲区实际上将包含自上次使用命令 expect
以来收到的所有内容。即使它确实与缓冲区正确匹配(例如,使用 string match *NOTFOUND* $result
),它也会受到 the echo problem 的影响:字符串 "FOUND" 和 "NOTFOUND" 在命令中发送,这很可能是由 SSH 服务器回显给您的。
脚本的以下修改通过不发送它期望的文字字符串来绕过回声问题。
它适用于 Windows 端的 Bitvise SSH 服务器。
log_user 1
spawn ssh -o "StrictHostKeyChecking=no" $username@$hostname
# Log in here.
send "set prefix=___\r" ;# Combat the echo problem.
send "IF EXIST C:\path\to\file\temp.zip (echo %prefix%FOUND) else (echo %prefix%NOTFOUND)\r"
expect {
___NOTFOUND {
error {file not found}
}
___FOUND {
send_user Found!\n
# Do things with the file.
}
}