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

如何优化Windows批处理脚本,避免两次输入SSH密钥密码?

优化.NET项目部署脚本:单次密码完成全流程部署

问题背景

现有Windows批处理脚本用于发布.NET项目并通过SSH部署到Linux服务器,但执行时scp和ssh命令需要分别输入一次SSH密钥密码,希望优化为仅输入一次密码即可完成文件上传、远程解压、目录迁移、权限配置、服务重启全流程。


推荐方案:配置SSH免密登录

这是最安全、长期可用的解决方案,配置完成后无需输入密码即可自动完成部署。

操作步骤

  1. 生成SSH密钥对(若未生成):
    打开Windows终端(PowerShell/CMD),执行命令:

    ssh-keygen
    

    按提示一路回车(无需设置密钥密码,或按需设置),密钥对会生成在C:\Users\<你的用户名>\.ssh目录下。

  2. 将公钥上传到服务器:
    执行以下命令,输入一次服务器密码后完成公钥配置:

    ssh-copy-id root@192.168.1.113
    
  3. 验证免密登录:
    执行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实现自动密码输入,仅需输入一次密码即可完成流程。

操作步骤

  1. 下载Plink工具:从PuTTY官方包中提取plink.exe,将其放到系统PATH目录(如C:\Windows\System32),或在脚本中指定完整路径。

  2. 修改脚本命令:将原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:21:16