如何使用 sftp 批处理文件发送密码
Posted
技术标签:
【中文标题】如何使用 sftp 批处理文件发送密码【英文标题】:How to send password using sftp batch file 【发布时间】:2012-07-29 02:31:10 【问题描述】:我正在尝试使用批处理脚本从 sftp 站点下载文件。我收到以下错误:
Permission denied (publickey,password,keyboard-interactive).
Couldn't read packet: Connection reset by peer
运行命令时:
sftp -b /home/batchfile.sftp <user>@<server ip>:<folder>
batchfile.sftp
包含这些数据:
password
lcd [local folder]
cd [sftp server folder]
get *
bye
注意:在提示符下运行时它正在工作
sftp <user>@<server ip>:<folder>
但我需要能够自动输入密码。
【问题讨论】:
通过从批处理文件中删除密码是否有效?通过手动输入密码,其余功能是否正常工作? 将密码以纯文本形式存储在文件中显然不安全——如果您不想每次都输入密码,我强烈建议您使用 RSA 密钥身份验证。 @lindhe 将密码存储在纯文本文件中显然与使用没有密码的 RSA 密钥身份验证一样安全。如果您要使事情自动化,这确实是唯一的选择。只需确保纯文本文件只能由文件所有者读取(就像 ssh 密钥所需的一样) 只是一个想法,但我使用的一种似乎与本地私有 ssh 密钥一样安全的方法是将文件放在 ~/.ssh 目录中,并具有与 .ssh/your_private_keyfile_name 相同的权限。我不推荐以下将密码放入 .bashrc 的方法,尤其是将其放入导出变量中。 .bashrc 被很多进程读取,并且密码在您的环境变量中以“纯文本”形式显示。如有疑问,请使用 .ssh 样式 :) 【参考方案1】:您需要安装 sshpass 程序。那么:
sshpass -p YOUR_PASSWORD sftp -oBatchMode=no -b YOUR_COMMAND_FILE_PATH USER@HOST
显然,最好设置公钥认证。仅在无论出于何种原因无法执行此操作时才使用它。
【讨论】:
谢谢!这是唯一真正回答问题的评论。有时根本无法获得密钥文件。 为了更安全,将export SSHPASS='your_password'
放到~/.bashrc
并使用-e
标志运行。我在一些这样的项目中使用过这个 cmd:echo 'ls -t upload/*.xml' | sshpass -e sftp -oBatchMode=no -b - user@example.com | grep -v "sftp>" | head -n1
让@Lev Lukomsky 更进一步,您希望从 ~/.bashrc 中删除组和世界读取权限。
我建议“不要”放入 .bashrc,因为这是一个一直在读取的混杂文件。尤其是不要将您的密码放在导出的变量中或出现在 .bash_history 中的任何地方......两者基本上都会将其放在纯文本中并将其保存在内存中......不好。将它放在您的 .ssh/ 目录中,与您的 ssh 私钥具有相同权限的文件中,并且永远不要以使其驻留在内存中、可由“ps”显示或在您的环境中的方式使用它。保持 ssh'y !【参考方案2】:
如果您正在生成要运行的命令堆,然后从终端调用该脚本,您可以尝试以下操作。
sftp login@host < /path/to/command/list
然后您将被要求输入您的密码(正常情况下),但是脚本中的所有命令都会在此之后运行。
这显然不是可以在cron
作业中使用的完全自动化选项,但可以从终端使用。
【讨论】:
【参考方案3】:我建议您使用 -v 选项运行 sftp。了解正在发生的事情变得容易得多。
手册明确指出:
最终使用格式允许使用 -b 进行自动会话 选项。 在这种情况下,需要配置非交互认证 避免在连接时输入密码(请参阅 sshd(8) 和 ssh-keygen(1) 了解详情)。
换句话说,你必须建立一个公钥认证。然后你就可以运行一个批处理脚本了。
附: 将密码放在批处理文件中是错误的。
【讨论】:
我否决了这个答案,因为它与问题的要求相反。 “附言” element 似乎是一个值得探讨的话题。事情很少有“正确”或“错误”之分,而是不同因素的妥协和权衡。【参考方案4】:PSFTP -b path/file_name.sftp user@IP_server -hostkey 1e:52:b1... -pw password
文件内容为:
lcd "path_file for send"
cd path_destination
mput file_name_to_send
quit
让主机密钥运行:
psftp user@IP_SERVER
【讨论】:
【参考方案5】:您需要使用命令 pscp 并强制它通过 sftp 协议。 pscp 会在你安装 PuttY 时自动安装,PuttY 是一个通过 ssh 连接到 linux 服务器的软件。
当你有你的 pscp 命令时,这里是命令行:
pscp -sftp -pw <yourPassword> "<pathToYourFile(s)>" <username>@<serverIP>:<PathInTheServerFromTheHomeDirectory>
这些参数(-sftp 和 -pw)仅适用于 pscp 而不是 scp。如果您想以递归方式上传文件夹中的所有内容,也可以添加 -r。
【讨论】:
【参考方案6】:您提到批处理文件,假设您说的是 Windows 系统,我是否正确?如果是这样,您将无法使用 sshpass,您将不得不切换到其他选项。
其中两个遵循截然相反的理念的选项是:
psftp:可以从批处理脚本中调用的命令行工具; psftp 是 PuTTY 包的一部分,你可以在这里找到它 http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html Syncplify.me FTP 脚本:用于 Windows 的可编写脚本的 FTP/S 和 SFTP 客户端,允许您将密码存储在加密的“配置文件”中;在这里查看 http://www.syncplify.me/products/ftp-script/无论哪种方式,强烈建议从密码切换到 PKI 身份验证。
【讨论】:
以上是关于如何使用 sftp 批处理文件发送密码的主要内容,如果未能解决你的问题,请参考以下文章