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

如何通过Bash脚本自动完成sudo vpnc连接后接入SSH远程服务器?

解决你的Expect脚本无法运行的问题

我看了你的脚本,几个小细节问题导致它跑不起来,我给你修正一下,再聊聊后续文件拷贝的思路:

脚本的核心问题

  • Shebang路径错误:你开头写的#! /usr/bin/不对,必须指定expect解释器的完整路径,正确写法是#!/usr/bin/expect(或者更通用的#!/usr/bin/env expect,适配不同系统的路径差异)。
  • Send命令缺少换行符:发送密码后终端需要回车才能确认输入,所以要在密码后面加\r或者\n,比如send "xxx\r"。
  • 匹配模式太死板:sudo的密码提示通常是[sudo] password for 你的用户名: ,而不是password: $,用通配符*匹配更可靠;另外vpnc连接成功后会有专属提示,得等它完成再启动SSH,不然网络还没就绪就会失败。

修正后的脚本

#!/usr/bin/env expect
set force_conservative 1
set timeout 10  # 延长超时时间,适配网络较慢的情况

# 启动sudo vpnc并处理连接流程
spawn sudo vpnc
expect {
    # 匹配sudo的密码提示
    "*password for*: " {
        send "你的sudo密码\r"
        exp_continue  # 继续等待vpnc的连接成功提示
    }
    # 匹配vpnc连接成功的标识(根据你实际的vpnc输出调整,比如"Connected")
    "*Connected*" {
        puts "VPN连接成功,准备发起SSH连接..."
    }
    timeout {
        puts "VPN连接超时,请检查配置或网络"
        exit 1
    }
}

# 启动SSH远程连接
spawn ssh marpic@192.xxx.xxx.xxx
expect {
    "*password: " {
        send "你的SSH密码\r"
    }
    timeout {
        puts "SSH连接超时"
        exit 1
    }
}

# 保持交互会话,让你可以操作远程服务器
interact

# 如果需要在交互结束后自动执行文件拷贝,可添加这行:
# exec ./copyfiles.sh

关于后续的copyfiles.sh计划

等VPN+SSH连接稳定后,文件拷贝可以这么实现:

  • 如果你想单独写脚本执行,copyfiles.sh里可以用scp命令,比如:
    #!/bin/bash
    # 本地文件拷贝到远程服务器
    scp /本地文件绝对路径 marpic@192.xxx.xxx.xxx:/远程目标路径
    # 或者从远程拷贝到本地
    # scp marpic@192.xxx.xxx.xxx:/远程文件路径 /本地目标路径
    
  • 要是想在expect脚本里自动完成拷贝(不需要手动交互),可以把最后的interact替换成scp的处理逻辑,比如:
    # 替换interact,自动执行文件拷贝
    spawn scp /本地文件路径 marpic@192.xxx.xxx.xxx:/远程目标路径
    expect "*password: " { send "你的SSH密码\r" }
    expect eof
    

内容的提问来源于stack exchange,提问作者lL. Bob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:40:54