SFTP硬编码密码仍需输入的问题求助
问题原因&解决方案
哦,这个问题我碰到过好几次了——你的脚本之所以还是弹出密码输入提示,核心原因是sftp命令本身不会从标准输入(比如你写的here-doc)读取密码,它会直接和终端交互索要密码,所以你硬编码的PASSWORD根本没被sftp接收到。
下面给你几个可行的解决办法,从简单到安全排序:
1. 用sshpass快速解决(最省心的临时方案)
sshpass是专门用来给ssh/sftp这类交互式命令自动喂密码的工具,先确保你的系统装了它:
- CentOS/RHEL:
sudo yum install sshpass - Ubuntu/Debian:
sudo apt install sshpass
然后把你的脚本改成这样:
PASSWORD="xyz" sshpass -p "$PASSWORD" sftp -oport=1002 user@host:/dir/archive/file*.txt /di/data/
sshpass会自动把密码注入到sftp的密码输入框,全程不需要手动操作。
2. 用expect脚本实现交互式控制(无依赖场景可选)
如果你的环境没法安装sshpass,那可以用expect来写一个小脚本,它能模拟人工输入的过程:
#!/usr/bin/expect -f # 设置密码 set password "xyz" # 启动sftp命令 spawn sftp -oport=1002 user@host:/dir/archive/file*.txt /di/data/ # 等待sftp弹出密码提示 expect "Password:" # 发送密码(注意后面的\r是回车符) send "$password\r" # 等待命令执行完成 expect eof
把这个脚本保存成sftp_with_password.exp,给它加执行权限:chmod +x sftp_with_password.exp,然后直接运行./sftp_with_password.exp就行。
3. 强烈推荐:改用SSH密钥登录(最安全的长期方案)
硬编码密码在脚本里真的很不安全——万一脚本被别人看到,密码直接泄露。更稳妥的方式是配置SSH免密登录:
- 在本地生成密钥对(一路按回车用默认配置就行):
ssh-keygen -t rsa
- 把本地的公钥复制到远程主机:
ssh-copy-id -p 1002 user@host
如果你的系统没有ssh-copy-id,可以手动复制本地~/.ssh/id_rsa.pub里的内容,粘贴到远程主机的~/.ssh/authorized_keys文件末尾。
配置完之后,你直接运行sftp -oport=1002 user@host:/dir/archive/file*.txt /di/data/,完全不用输密码,而且安全性拉满。
内容的提问来源于stack exchange,提问作者Himanshu Pant
相关产品推荐
相关产品推荐

