SFTP文件传输脚本卡在密码输入环节的解决咨询
SFTP文件传输脚本卡在密码输入环节的解决咨询
嗨,我完全懂你的困扰——手动敲命令的时候一切顺畅,但写成批处理脚本后,输入密码就卡住了,没法自动执行后续的put *.txt命令,对吧?这是因为普通的批处理没法直接在交互式SFTP会话里自动衔接指令,给你几个实用的解决办法:
方法1:用批量指令文件配合SFTP的批量模式
SFTP支持通过-b参数指定一个包含指令的文本文件,这样就能自动执行里面的命令,不用手动输入。不过原生SFTP没法直接在文件里写密码,所以得结合免密或者支持密码参数的工具使用,先看基础写法:
- 先创建一个包含SFTP指令的文本文件,比如
sftp_commands.txt,内容如下:
put *.txt quit
- 然后在批处理里调用SFTP并指定这个指令文件:
cd c:\users\user\documents\transfer sftp -b sftp_commands.txt user@10.24.200.38
不过这时候还是会弹出密码输入框,要解决自动输密码的问题,更推荐下面两种方法。
方法2:用PuTTY的psftp工具(适配Windows环境)
psftp是PuTTY套件里的SFTP工具,支持直接在命令行指定密码,完美适配批处理:
方式A:直接在脚本内嵌指令
cd c:\users\user\documents\transfer psftp user@10.24.200.38 -pw 你的密码 -b - << EOF put *.txt quit EOF
方式B:用独立指令文件(适合多指令场景)
cd c:\users\user\documents\transfer echo put *.txt> sftp_cmds.txt echo quit>> sftp_cmds.txt psftp user@10.24.200.38 -pw 你的密码 -b sftp_cmds.txt
⚠️ 提醒:把密码明文写在脚本里有安全风险,若服务器权限管理不严容易泄露,优先考虑下面的免密方法。
方法3:配置SSH密钥免密登录(最安全可靠)
这是长期使用的最优解,彻底告别密码输入环节:
- 生成SSH密钥对:用PuTTYgen(PuTTY套件工具)或者Windows自带的
ssh-keygen命令生成密钥对,一路默认设置即可,不要设置密钥密码(否则还是需要手动输入,失去自动执行的意义)。 - 上传公钥到服务器:把生成的公钥文件(比如
id_rsa.pub)内容复制到服务器上用户目录下的~/.ssh/authorized_keys文件里(如果是Windows服务器,对应路径为C:\Users\你的用户名\.ssh\authorized_keys,需自行创建目录和文件)。 - 修改批处理脚本:现在无需密码验证,直接执行指令:
cd c:\users\user\documents\transfer sftp user@10.24.200.38 << EOF put *.txt quit EOF
或者依旧使用批量指令文件的方式,效果一致。
为什么原来的脚本会卡住?
你原来的批处理是按顺序执行命令:先进入指定目录,然后启动sftp交互式会话,此时批处理会暂停,等待你在SFTP会话里手动输入密码和指令;而后面的put *.txt是批处理上下文里的命令,并非SFTP会话内的指令,所以永远不会被执行——这就是卡住的核心原因。
备注:内容来源于stack exchange,提问作者PGA




