如何优化Windows批处理脚本,避免两次输入SSH密钥密码?
优化.NET项目部署脚本:单次密码完成全流程部署
问题背景
现有Windows批处理脚本用于发布.NET项目并通过SSH部署到Linux服务器,但执行时scp和ssh命令需要分别输入一次SSH密钥密码,希望优化为仅输入一次密码即可完成文件上传、远程解压、目录迁移、权限配置、服务重启全流程。
推荐方案:配置SSH免密登录
这是最安全、长期可用的解决方案,配置完成后无需输入密码即可自动完成部署。
操作步骤
生成SSH密钥对(若未生成):
打开Windows终端(PowerShell/CMD),执行命令:ssh-keygen按提示一路回车(无需设置密钥密码,或按需设置),密钥对会生成在
C:\Users\<你的用户名>\.ssh目录下。将公钥上传到服务器:
执行以下命令,输入一次服务器密码后完成公钥配置:ssh-copy-id root@192.168.1.113验证免密登录:
执行ssh root@192.168.1.113,若无需输入密码即可登录,则配置成功。
优化后脚本(免密版)
直接使用原脚本即可,此时scp和ssh命令会自动复用SSH会话,无需重复输入密码:
REM publish example.csproj and ssh-deploy to web-server if exist "D:\inetpub\HomepageExample.rar" ( del "D:\inetpub\HomepageExample.rar" echo File deleted successfully. ) else ( echo File does not exist. ) del /f /q "D:\inetpub\HomepageExample\*" /s for /d %%i in (D:\inetpub\HomepageExample\*) do rd /s /q "%%i" dotnet publish "D:\Repositories\gitlab\OldHomepages\HomepageExample_v8\HomepageExample_v8.csproj" --runtime linux-x64 --configuration Release --self-contained true /p:PublishSingleFile=true --output "D:\inetpub\HomepageExample\" "C:\Program Files\WinRAR\rar.exe" a -ep1 -r "D:\inetpub\HomepageExample.rar" "D:\inetpub\HomepageExample\*" del /f /q "D:\inetpub\HomepageExample\*" /s for /d %%i in (D:\inetpub\HomepageExample\*) do rd /s /q "%%i" scp "D:\inetpub\HomepageExample.rar" root@192.168.1.113:/root/Downloads/ ssh root@192.168.1.113 "rm -rf \"/opt/www/example.com/\"*; unrar x \"/root/Downloads/HomepageExample.rar\" \"/opt/www/example.com/\"; sudo mv \"/opt/www/example.com/HomepageExample_v8\" \"/opt/www/example.com/HomepageExample\"; sudo chown -R www-data:www-data \"/opt/www/example.com/\"; sudo chmod +x \"/opt/www/example.com/HomepageExample\"; sudo systemctl restart \"kestrel-example-com.service\"; rm -f \"/root/Downloads/HomepageExample.rar\"; "
临时方案:使用Plink自动传递密码
若无法配置免密登录,可使用PuTTY工具集的plink.exe实现自动密码输入,仅需输入一次密码即可完成流程。
操作步骤
下载Plink工具:从PuTTY官方包中提取
plink.exe,将其放到系统PATH目录(如C:\Windows\System32),或在脚本中指定完整路径。修改脚本命令:将原
scp和ssh命令替换为plink调用,通过-pw参数传递密码。
优化后脚本(Plink版)
REM publish example.csproj and ssh-deploy to web-server set SSH_PASSWORD=你的服务器密码 set SERVER=root@192.168.1.113 if exist "D:\inetpub\HomepageExample.rar" ( del "D:\inetpub\HomepageExample.rar" echo File deleted successfully. ) else ( echo File does not exist. ) del /f /q "D:\inetpub\HomepageExample\*" /s for /d %%i in (D:\inetpub\HomepageExample\*) do rd /s /q "%%i" dotnet publish "D:\Repositories\gitlab\OldHomepages\HomepageExample_v8\HomepageExample_v8.csproj" --runtime linux-x64 --configuration Release --self-contained true /p:PublishSingleFile=true --output "D:\inetpub\HomepageExample\" "C:\Program Files\WinRAR\rar.exe" a -ep1 -r "D:\inetpub\HomepageExample.rar" "D:\inetpub\HomepageExample\*" del /f /q "D:\inetpub\HomepageExample\*" /s for /d %%i in (D:\inetpub\HomepageExample\*) do rd /s /q "%%i" REM 使用plink替代scp上传文件 plink -pw %SSH_PASSWORD% %SERVER% "mkdir -p /root/Downloads" plink -pw %SSH_PASSWORD% -batch %SERVER% put "D:\inetpub\HomepageExample.rar" /root/Downloads/ REM 使用plink执行远程命令 plink -pw %SSH_PASSWORD% -batch %SERVER% "rm -rf \"/opt/www/example.com/\"*; unrar x \"/root/Downloads/HomepageExample.rar\" \"/opt/www/example.com/\"; sudo mv \"/opt/www/example.com/HomepageExample_v8\" \"/opt/www/example.com/HomepageExample\"; sudo chown -R www-data:www-data \"/opt/www/example.com/\"; sudo chmod +x \"/opt/www/example.com/HomepageExample\"; sudo systemctl restart \"kestrel-example-com.service\"; rm -f \"/root/Downloads/HomepageExample.rar\"; "
注意:将
set SSH_PASSWORD=你的服务器密码中的密码替换为实际密码,此方式存在密码明文存储风险,仅适合临时场景。
内容的提问来源于stack exchange,提问作者Stefan Steiger
相关产品推荐
相关产品推荐

