You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将远程服务器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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 22:20:27