在Linux环境下用惯scp命令传输文件的技术人员,切换到Windows系统时总会觉得文件传输不够高效。虽然Windows自带了远程桌面和共享文件夹功能,但这些方案要么需要图形界面,要么存在权限管理复杂的问题。微软从Windows 10 1809版本开始原生集成OpenSSH服务,让我们可以在Windows上获得与Linux一致的命令行文件传输体验。
我最近在帮客户部署混合云环境时,就遇到了需要在20多台Windows服务器之间批量传输配置文件的场景。通过配置OpenSSH服务端和客户端,不仅实现了脚本化文件传输,还能复用现有的Linux运维工具链。下面就把完整的配置过程和经验总结分享给大家。
首先按Win+R输入winver查看系统版本,确认是Windows 10 1809或更高版本。如果是Windows Server则需要2019及以上版本。早期的Windows系统虽然也能手动安装OpenSSH,但会遇到各种依赖问题,建议直接升级系统。
注意:企业环境中如果使用LTSC长期服务版,可能需要单独下载OpenSSH安装包
安装完成后,在PowerShell中运行以下命令验证:
powershell复制Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
应该看到两个组件的State状态为"Installed"。
以管理员身份启动PowerShell,执行服务初始化命令:
powershell复制# 设置服务自动启动
Set-Service -Name sshd -StartupType 'Automatic'
# 立即启动服务
Start-Service sshd
# 验证服务状态
Get-Service sshd
Windows防火墙默认会阻止SSH连接,需要添加放行规则:
powershell复制New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
如果企业网络有组策略限制,可能需要额外配置:
powershell复制# 允许通过域网络访问
Set-NetFirewallRule -Name sshd -Profile Domain
配置文件路径为C:\ProgramData\ssh\sshd_config,需要关注以下参数:
code复制# 允许密码认证(初期调试建议开启)
PasswordAuthentication yes
# 指定密钥文件路径(默认即可)
AuthorizedKeysFile .ssh/authorized_keys
# 禁用root登录(安全加固)
PermitRootLogin no
修改后需要重启服务生效:
powershell复制Restart-Service sshd
从Windows上传文件到Linux服务器:
powershell复制scp C:\test.txt user@linux-server:/home/user/
从Linux下载文件到Windows:
powershell复制scp user@linux-server:/var/log/app.log C:\logs\
递归传输整个目录:
powershell复制scp -r C:\project\ user@server:/opt/
powershell复制ssh-keygen -t rsa -b 4096
powershell复制type $env:USERPROFILE\.ssh\id_rsa.pub | ssh user@server "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
powershell复制ssh user@server
限速传输(防止占用全部带宽):
powershell复制scp -l 8192 largefile.iso user@server:/backups/
保持文件属性(适用于备份场景):
powershell复制scp -p config.ini user@server:/etc/app/
现象:执行scp命令后长时间无响应
排查步骤:
powershell复制Get-Service sshd
powershell复制netstat -ano | findstr :22
powershell复制ssh localhost
现象:收到"Permission denied"错误
解决方案:
powershell复制ssh -v user@server
在sshd_config中添加:
code复制AcceptEnv LANG LC_*
客户端连接时指定编码:
powershell复制set LANG=zh_CN.UTF-8 && scp file.txt server:/path/
powershell复制ssh-keygen -A
我在实际运维中发现,很多管理员会忽略密钥文件的权限设置。正确的做法是:
powershell复制icacls $env:USERPROFILE\.ssh\id_rsa /inheritance:r /grant:r "$env:USERNAME:(R)"