如何通过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
相关产品推荐
相关产品推荐

