如何将远程服务器df -kh命令输出保存到本地变量或文件?
解决远程服务器命令输出保存到本地的问题
问题分析
你的脚本存在以下核心问题:
- 提示符正则匹配失效:原
PROMPT未匹配到带主机名和ANSI颜色码的实际提示符REMY_SERVER:~ # - 命令输出的正则过于僵化,未考虑终端控制字符和输出延迟
- Expect变量无法直接传递到父bash进程
- 多余的
interact导致脚本卡在交互状态
修复后的Expect脚本
以下是修改后的脚本,可正确捕获远程df -kh /的输出并保存到本地文件:
#!/bin/bash my_pass=!!psw!! server=10.10.10.10 /usr/bin/expect << ENDOFEXPECT exp_internal 0 ;# 关闭调试,调试时可改为1 # 匹配带ANSI颜色的提示符:忽略控制码,兼容"主机名:~ # "格式 set PROMPT {\u001b\[[0-9;]*m.*:~ # \u001b\[[0-9;]*m} set timeout 30 spawn ssh root@$server expect "assword:" send "$my_pass\r" # 等待登录完成,匹配提示符(跳过欢迎信息) expect -re $PROMPT send -- "df -kh /\r" # 先跳过命令本身的回显 expect -re "df -kh /\r\n" # 捕获命令输出(从换行后到下一个提示符前的内容) expect -re "(.*)\r\n$PROMPT" set command_output \$expect_out(1,string) # 将输出写入本地文件 set fp [open "./result.txt" "w"] puts \$fp \$command_output close \$fp # 退出ssh会话 send "exit\r" eof ENDOFEXPECT # 从文件读取内容到本地变量(按需使用) command_output=$(cat ./result.txt) echo "=====================" echo " >> 捕获的远程输出:" echo "$command_output"
关键修改点
- 优化提示符正则:用
\u001b\[[0-9;]*m匹配ANSI颜色控制码,确保识别带颜色的终端提示符 - 调整输出捕获逻辑:跳过命令回显,捕获命令执行后到下一个提示符的所有内容,避免因输出格式变化导致匹配失败
- 本地文件写入:在Expect内部直接写入本地文件,解决变量跨进程传递问题
- 移除
interact:执行完命令后发送exit退出ssh会话,避免脚本卡住
更简洁的替代方案:使用sshpass
若系统允许安装sshpass,可完全替代Expect,脚本更简洁:
#!/bin/bash my_pass=!!psw!! server=10.10.10.10 # 直接执行远程命令,输出保存到本地文件 sshpass -p "$my_pass" ssh -o StrictHostKeyChecking=no root@$server "df -kh /" > ./result.txt # 读取到本地变量 command_output=$(cat ./result.txt) echo "=====================" echo " >> 捕获的远程输出:" echo "$command_output"
说明
-o StrictHostKeyChecking=no:首次连接时自动接受主机密钥,避免交互式提示- 输出直接通过重定向
>保存到本地文件,无需处理复杂正则匹配
内容的提问来源于stack exchange,提问作者Enissay
相关产品推荐
相关产品推荐

