PowerShell中使用SFTP上传文件无输出及密码配置问题
SFTP上传命令密码相关问题解答
你执行的这条命令默认需要密码验证。执行后无任何输出的核心原因是:原生sftp是交互式程序,启动后会先暂停等待用户输入密码完成身份校验,你通过管道仅传入了文件上传指令,没有传入校验所需的密码,进程会一直卡在密码等待阶段,自然不会产生输出。
注意:原生OpenSSH自带的sftp客户端没有提供命令行直接传入明文密码的参数,这是官方出于安全考虑做的设计,不存在「在sftp命令某个参数位置直接写密码」的原生用法,要实现非交互式传密码上传,可以用以下几种方案:
- 方案1:借助sshpass工具传入密码(最适配你当前的单命令写法)
提前安装sshpass工具后,通过sshpass先行传入密码,再唤起sftp进程,推荐用here-document替代echo管道传操作指令,避免转义问题,执行完上传后主动断开连接:
注意:该方案密码会明文保存在命令历史中,仅适合临时调试使用,生产环境不推荐。如果你的SFTP服务没有用默认22端口,需要在sshpass -p "你的SFTP账号对应密码" sftp TESTSHELTER@shelter-ftp.outlinesys.com << EOF put C:\Users\abhishek.chawla\Desktop\AbhishekC_bills.zip deployment/AbhishekC_bills.zip bye EOFsftp后加上-P 你的服务端口号参数,否则会连不上服务端卡住。 - 方案2:配置SSH密钥免密登录(长期使用最安全的方案)
本地生成SSH密钥对后,将公钥上传到SFTP服务端对应用户的信任公钥列表中,后续所有sftp连接会自动走公钥身份校验,不需要输入密码,你原本写的管道命令不需要额外加密码参数就能直接运行。 - 方案3:用expect脚本自动填充密码
没有安装sshpass权限的场景,可以写expect脚本捕获sftp输出的密码提示,自动填入密码完成校验后执行上传操作,示例脚本:#!/usr/bin/expect spawn sftp TESTSHELTER@shelter-ftp.outlinesys.com expect "*password:*" send "你的SFTP账号对应密码\r" expect "sftp>" send "put C:\\Users\\abhishek.chawla\\Desktop\\AbhishekC_bills.zip deployment/AbhishekC_bills.zip\r" expect "sftp>" send "bye\r" expect eof
内容的提问来源于stack exchange,提问作者Abhi Chawla
相关产品推荐
相关产品推荐

