Ubuntu本地脚本远程执行仅运行首条命令的问题排查及VPS自动化配置脚本资源求助
Ubuntu本地脚本远程执行仅运行首条命令的问题排查及VPS自动化配置脚本资源求助
看起来你在搭建VPS自动化配置脚本的过程中遇到了一个挺闹心的小问题,我来帮你捋捋原因和解决办法,再给你推荐一些可用的资源。
问题1:脚本仅执行首条命令的原因及解决方法
问题根源
你在SSH命令里加了-tt参数,这个参数的作用是强制为远程会话分配伪终端,但这会打乱脚本的执行流程:
当第一个命令(apt update -y)执行完成后,远程shell会进入交互模式,后续的命令文本只是被打印到终端上,并不会被执行。同时,本地的输入被伪终端占用,导致你手动输入命令也没反应,直到按^C断开连接。
解决办法
给你几个靠谱的方案,按需选择:
方案1:移除-tt参数(最推荐)
因为你执行的是非交互式脚本,不需要强制分配伪终端,直接去掉-tt即可:
# 执行本地脚本的方式 SSHPASS='mypassword' sshpass -e ssh -o StrictHostKeyChecking=no root@XX.XX.XX.XX 'bash -s' < ./VPS_Setup_01_Update_OS.sh # Here-doc的方式 SSHPASS='mypassword' sshpass -e ssh -o StrictHostKeyChecking=no root@XX.XX.XX.XX <<ENDSSH1 apt update -y apt upgrade -y apt autoremove -y apt autoclean -y ENDSSH1
方案2:如果需要伪终端(比如后续脚本有交互步骤)
可以把脚本内容用bash -c包裹,同时注意引号转义:
SSHPASS='mypassword' sshpass -e ssh -tt -o StrictHostKeyChecking=no root@XX.XX.XX.XX "bash -c 'apt update -y && apt upgrade -y && apt autoremove -y && apt autoclean -y'"
方案3:先传脚本到远程再执行(适合复杂脚本)
把本地脚本上传到远程机器的临时目录,再远程执行,避免输入流的问题:
# 上传脚本 SSHPASS='mypassword' sshpass -e scp ./VPS_Setup_01_Update_OS.sh root@XX.XX.XX.XX:/tmp/ # 执行脚本 SSHPASS='mypassword' sshpass -e ssh -o StrictHostKeyChecking=no root@XX.XX.XX.XX 'bash /tmp/VPS_Setup_01_Update_OS.sh'
问题2:VPS自动化配置脚本的资源推荐
你可以从这几个方向找现成的资源,再根据自己的需求修改:
- Ubuntu Cloud Init配置:这是Ubuntu官方的自动化初始化工具,很多云服务商都支持。你可以写一个
cloud-config文件,定义用户创建、时区设置、软件更新、SSH配置等内容,比bash脚本更标准化、更可靠。 - 社区开源脚本:搜索关键词比如「ubuntu vps setup script」「ubuntu server hardening script」,会找到很多开发者分享的初始化脚本,通常包含创建sudo用户、禁用root远程登录、配置UFW防火墙、安装常用工具等核心功能,你可以直接修改复用。
- 配置管理工具Playbook:如果想更专业地管理VPS配置,可以试试Ansible。很多社区分享了现成的Ubuntu VPS初始化Playbook,你只需要修改少量参数就能直接使用,后续维护多台VPS也更方便。
备注:内容来源于stack exchange,提问作者Emmanuel FRANCOIS
相关产品推荐
相关产品推荐

