如何在SFTP登录时使用加密密码?无交互脚本实现咨询
无交互SFTP登录的安全实现方案
一、参数传递加密密码的实现方案
如果必须通过参数传递密码,可通过对称加密先将明文密码加密,脚本内部解密后再使用,规避明文泄露风险:
1. 提前加密明文密码
使用openssl进行对称加密,生成加密后的密码文件:
# 执行时会要求输入加密密钥,生成encrypted_pass.txt加密文件 echo "password@123" | openssl enc -aes-256-cbc -salt -out encrypted_pass.txt
2. 修改脚本支持解密逻辑
调整原脚本,接收加密密码文件、解密密钥作为参数,解密后获取明文密码:
#!/bin/bash if [[ "${#}" -lt 5 ]]; then echo -e "Usage: ${0} <sftpUser> <encryptedPassFile> <decryptKey> <sftpHost> <sftpPort>" exit 1 fi sftpUser=${1} encryptedPassFile=${2} decryptKey=${3} sftpHost=${4} sftpPort=${5} remote_dir="/home/vagrant" source_dir="/home/vagrant/sftpDir" # 解密获取明文密码 sftpPassword=$(openssl enc -aes-256-cbc -d -salt -in ${encryptedPassFile} -k ${decryptKey}) sftpFile="/tmp/tempfile" echo "cd ${remote_dir}" >> ${sftpFile} echo "mget * ${source_dir}" >> ${sftpFile} echo "quit" >> ${sftpFile} expect -c " spawn sftp -P ${sftpPort} -o \"BatchMode=no\" -b \"${sftpFile}\" ${sftpUser}@${sftpHost} expect -nocase \"*Password:\" { send \"${sftpPassword}\r\"; interact } " rm -rf ${sftpFile}
关键注意事项
- 解密密钥不要通过命令行直接传入,建议用环境变量(如
export DECRYPT_KEY="your_secret_key"),避免留在命令历史中 - 加密文件设置严格权限:
chmod 600 encrypted_pass.txt,限制无关用户访问
二、更安全的无交互SFTP替代方案
1. SSH密钥对认证(最优方案)
这是无交互SFTP最安全的实现方式,完全无需密码:
生成客户端密钥对:
ssh-keygen -t rsa -b 4096一路回车即可生成
~/.ssh/id_rsa(私钥)和~/.ssh/id_rsa.pub(公钥)上传公钥到SFTP服务器:
# 自动上传公钥并配置权限 ssh-copy-id -p <sftpPort> <sftpUser>@<sftpHost>或手动复制公钥内容到服务器的
~/.ssh/authorized_keys,并设置权限:cat ~/.ssh/id_rsa.pub | ssh -p <sftpPort> <sftpUser>@<sftpHost> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && chmod 700 ~/.ssh"简化脚本逻辑:
#!/bin/bash if [[ "${#}" -lt 3 ]]; then echo -e "Usage: ${0} <sftpUser> <sftpHost> <sftpPort>" exit 1 fi sftpUser=${1} sftpHost=${2} sftpPort=${3} remote_dir="/home/vagrant" source_dir="/home/vagrant/sftpDir" sftpFile="/tmp/tempfile" echo "cd ${remote_dir}" >> ${sftpFile} echo "mget * ${source_dir}" >> ${sftpFile} echo "quit" >> ${sftpFile} # 直接通过密钥认证登录,无需密码 sftp -P ${sftpPort} -b "${sftpFile}" ${sftpUser}@${sftpHost} rm -rf ${sftpFile}
2. 使用sshpass工具(备选)
sshpass可直接传递密码,无需expect脚本,但需注意密码泄露风险:
安装
sshpass:# Debian/Ubuntu apt install sshpass # CentOS/RHEL yum install sshpass修改脚本:
#!/bin/bash if [[ "${#}" -lt 4 ]]; then echo -e "Usage: ${0} <sftpUser> <sftpPassword> <sftpHost> <sftpPort>" exit 1 fi sftpUser=${1} sftpPassword=${2} sftpHost=${3} sftpPort=${4} remote_dir="/home/vagrant" source_dir="/home/vagrant/sftpDir" sftpFile="/tmp/tempfile" echo "cd ${remote_dir}" >> ${sftpFile} echo "mget * ${source_dir}" >> ${sftpFile} echo "quit" >> ${sftpFile} # 通过sshpass传递密码,建议用文件读取密码避免命令行暴露 sshpass -p "${sftpPassword}" sftp -P ${sftpPort} -b "${sftpFile}" ${sftpUser}@${sftpHost} rm -rf ${sftpFile}更安全的做法是将密码存到文件,通过
-f参数读取:sshpass -f password.txt sftp ...,并给密码文件设置chmod 600权限。
3. 使用lftp工具
lftp支持直接指定SFTP账号密码,语法更简洁:
#!/bin/bash if [[ "${#}" -lt 4 ]]; then echo -e "Usage: ${0} <sftpUser> <sftpPassword> <sftpHost> <sftpPort>" exit 1 fi sftpUser=${1} sftpPassword=${2} sftpHost=${3} sftpPort=${4} remote_dir="/home/vagrant" source_dir="/home/vagrant/sftpDir" # 执行SFTP操作并退出 lftp -u ${sftpUser},${sftpPassword} sftp://${sftpHost}:${sftpPort} -e "cd ${remote_dir}; mget * -O ${source_dir}; quit"
内容的提问来源于stack exchange,提问作者Gautam Soni
相关产品推荐
相关产品推荐

