在Windows系统中使用命令行进行SFTP操作,可以通过内置的PowerShell或第三方工具如PuTTY实现,以下将详细介绍两种方法的操作步骤、常见命令及注意事项,帮助用户高效完成远程文件传输任务。

使用Windows PowerShell进行SFTP操作
Windows 10及以上版本默认支持OpenSSH客户端,可直接通过PowerShell执行SFTP命令,操作前需确保已安装OpenSSH工具(可通过“设置”-“应用”-“可选功能”-“添加功能”安装)。
连接SFTP服务器
sftp username@hostname
username:服务器用户名hostname:服务器IP地址或域名 执行后会提示输入密码,也可通过-i参数指定私钥文件路径:sftp -i C:\path\to\private_key username@hostname
常用SFTP命令
连接成功后,进入SFTP交互模式,可执行以下命令:
| 命令 | 功能 | 示例 |
|---|---|---|
ls |
列出当前目录文件 | ls -l(显示详细信息) |
cd |
切换远程目录 | cd /var/www |
get |
下载文件 | get remote_file.txt C:\local\path |
put |
上传文件 | put C:\local\file.txt /remote/path/ |
mkdir |
创建远程目录 | mkdir new_folder |
rm |
删除远程文件 | rm old_file.txt |
pwd |
显示当前远程路径 | pwd |
quit |
退出SFTP会话 | quit |
批量操作示例
下载整个远程目录:
get -r remote_dir/ C:\local\path
上传本地目录并保持结构:

put -r C:\local\dir/ /remote/path/
高级技巧
- 免密登录:通过SSH密钥对实现,需将公钥上传至服务器
~/.ssh/authorized_keys。 - 脚本化操作:在PowerShell脚本中调用SFTP命令,
$sftpArgs = "-b $((Get-Content script.sftp) -join "`n") username@hostname" Start-Process sftp.exe -ArgumentList $sftpArgs -Wait
其中
script.sftp包含多行SFTP命令。
使用PuTTY实现SFTP操作
若系统未安装OpenSSH,可通过PuTTY的PSFTP工具实现SFTP操作。
下载与配置
- 下载PuTTY套件(包含PSFTP)并解压到系统路径。
- 生成密钥对(若使用密钥认证):
puttygen -t rsa -b 2048 -C "your_email@example.com"
保存私钥(.ppk文件)并上传公钥至服务器。
连接服务器
psftp username@hostname
使用密钥认证需指定私钥:

psftp -i private_key.ppk username@hostname
核心命令
| 命令 | 功能 | 示例 |
|---|---|---|
ls |
列出文件 | ls -a(显示隐藏文件) |
cd |
切换目录 | cd /home/user |
get |
下载文件 | get -r remote_dir |
put |
上传文件 | put local_file.txt |
mget |
批量下载 | mget *.txt |
mput |
批量上传 | mput *.log |
配置文件传输模式
PSFTP默认使用ASCII模式传输文本文件,需手动切换为二进制模式:
binary # 后续传输均使用二进制模式 ascii # 切换回文本模式
常见问题与解决方案
-
连接超时
检查防火墙设置是否开放SFTP默认端口(22),或尝试指定端口:sftp -P 2222 username@hostname
-
权限错误
确保本地用户对目标路径有读写权限,远程用户对服务器目录有操作权限,可通过chmod修改远程权限:chmod 755 /remote/directory
相关问答FAQs
Q1: 如何在SFTP会话中查看传输进度?
A1: PowerShell的SFTP命令本身不显示进度,但可通过第三方工具如lftp或winscp.com(命令行模式)实现进度显示,例如使用lftp:
lftp -u username,password -e "pget -n 10 remote_file; exit" sftp://hostname
其中-n参数指定并行任务数。
Q2: 如何通过SFTP自动同步本地与远程目录?
A2: 可编写脚本结合rsync(需安装)或使用SFTP的get/put命令配合循环逻辑,例如PowerShell脚本示例:
$remoteDir = "/remote/path"
$localDir = "C:\local\path"
$sftpSession = Start-Process sftp -ArgumentList "username@hostname" -PassThru -NoNewWindow
Get-ChildItem $localDir | ForEach-Object {
$remoteFile = Join-Path $remoteDir $_.Name
$command = "put `"$($_.FullName)`" `"$remoteFile`""
$sftpSession.StandardInput.WriteLine($command)
}
$sftpSession.StandardInput.WriteLine("quit")
$sftpSession.WaitForExit()
需注意复杂场景建议使用专业工具如Unison或FreeFileSync。
