如何使用sftp批处理文件发送密码

42

我正在尝试使用批处理脚本从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>

但我需要自动输入密码的能力。


1
通过从批处理文件中删除密码,它是否正常工作?通过手动输入密码,剩余的功能是否正常工作? - mtk
在文件中以明文形式存储密码显然不安全 - 如果您不想每次都输入密码,强烈建议使用RSA密钥身份验证。 - lindhe
@lindhe 在明文文件中存储密码显然与在RSA密钥身份验证时不使用密码的安全性一样,这真的是唯一的选择,如果你要自动化事情。只需确保明文文件仅可由文件所有者读取(就像ssh密钥所需的那样)。 - Ferry Boender
只是一个想法,但我使用的一种方法似乎与本地私有ssh密钥一样安全,就是将文件放在~/.ssh目录中,并具有与.ssh/{your_private_keyfile_name}相同的权限。 我不建议采用下面的方法将密码放入.bashrc中,特别是将其放入导出变量中。 .bashrc被如此多的进程读取,并且密码以“纯文本”形式存在于您的环境变量中。 如果有疑问,请按照.ssh样式操作 :) - jatal
8个回答

62

您需要安装sshpass程序。然后:

sshpass -p您的密码 sftp -oBatchMode = no -b您的命令文件路径 USER@HOST

显然,最好设置公钥身份验证。只有在无法实现该操作时才使用此选项。


3
谢谢!这是唯一一个真正回答问题的评论。有时候无法获取密钥文件。 - jbrown
2
为了更安全地执行此操作,请将 export SSHPASS='your_password' 添加到 ~/.bashrc 文件中,并使用 -e 标志运行。我在一些类似这样的项目中使用了这个命令:echo 'ls -t upload/*.xml' | sshpass -e sftp -oBatchMode=no -b - user@example.com | grep -v "sftp>" | head -n1 - Lev Lukomsky
1
将@Lev Lukomsky的方法再进一步,您需要从~/.bashrc中删除组和全局读取权限。 - RegularlyScheduledProgramming
1
我建议“不要”将其放在.bashrc中,因为那是一个经常读取的杂项文件。特别是不要将您的密码放在导出变量或任何显示在.bash_history中的地方...两者基本上都会将其以明文形式放置并保留在内存中...不好。将其放在您的.ssh/目录中,在与您的ssh私钥相同权限的文件中,并且永远不要以使其保留在内存中、可通过'ps'显示或在您的环境中使用的方式使用它。保持ssh'y! - jatal
另外,参见 https://dev59.com/CG435IYBdhLWcg3wfQJ9,使用 sshpass -e 和 SSHPASS 环境变量比在命令行中传递密码更安全,因为这样可以避免所有用户在主机上看到密码。 - DogBoneBlues
谢谢你!一个程序使用一个选项,但要使用该选项,你必须告诉辅助程序不要使用该选项...... 用批处理文件使用SFTP,但告诉SSH不要使用批处理文件。太聪明了 :-) - Paul Littlefield

25

如果你正在生成一堆需要运行的命令,并且希望从终端调用该脚本,那么可以尝试以下操作。

sftp login@host < /path/to/command/list

接着,系统会要求您输入密码(与平常一样),之后脚本中的所有命令都会运行。

显然,这不是完全自动化的选项,无法在 cron 作业中使用,但可以在终端中使用。


2
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

对于Windows用户,psftp是与 PuTTY 一起安装的命令行工具,而sshpass不可用。请参阅 https://the.earth.li/~sgtatham/putty/0.52/htmldoc/Chapter6.html - Rohim Chou

1
我建议您使用 -v 选项运行 sftp。这样可以更容易地理解发生了什么。
手册清楚地说明:
最终的使用格式允许使用 -b 选项进行自动化会话。在这种情况下,需要配置非交互式身份验证以避免在连接时输入密码(有关详细信息,请参见 sshd(8)和 ssh-keygen(1))。
换句话说,您必须建立公钥身份验证。然后您就能运行批处理脚本了。
附注: 在批处理文件中放置密码是错误的。

7
我下投票反对这个回答,因为它与问题相反。这个“P.S.”元素似乎是一个值得探讨的话题。事情很少是“对”或“错”,而是不同因素的妥协和权衡。 - greggles

1
你需要使用命令pscp,并强制通过sftp协议传输。当你安装PuttY时,pscp会自动安装,PuttY是一款通过ssh连接到Linux服务器的软件。
当你拥有了pscp命令后,以下是命令行:
pscp -sftp -pw <yourPassword> "<pathToYourFile(s)>" <username>@<serverIP>:<PathInTheServerFromTheHomeDirectory>

这些参数(-sftp和-pw)仅适用于pscp而不是scp。如果您想以递归方式上传文件夹中的所有内容,也可以添加-r。

0

可以使用标准的expect工具来实现这一点:

SFTP_SERVER='myserver.com'
SFTP_USER='mysftp_user'
SFTP_PWD='12345'

SFTP_BATCH=sftp.bat  #existing batch file with sftp commands to execute

SFTP_IGNORE_PUBKEY='-o "PubkeyAuthentication=no"'   # optional param

expect <<EOF
        set timeout 120
        spawn sftp -q -o "BatchMode=no" $SFTP_IGNORE_PUBKEY -b "$SFTP_SCRIPT" "$SFTP_USER@$SFTP_SERVER"
        expect  {
            -nocase "Are you sure you want to continue connecting (yes/no)?" { send "yes\r" ; exp_continue}
            -nocase "*password:" { send "$SFTP_PWD\r"; exp_continue }
            -nocase -re "failed|invalid password|timeout" abort
        }
        catch wait result
        exit [lindex \$result 3]  #catch and forward sftp result code
EOF
    rc=$?
echo $rc

这里:

  • -o "BatchMode=no" 允许交互
  • -q - 静默执行,避免在日志中出现长时间的“服务器问候”消息
  • 期望代码在需要时回答是和密码,并拦截sftp进程的退出代码。

0
你提到了批处理文件,那么我可以假设你在谈论Windows系统吗?如果是这样,你不能使用sshpass,你将不得不切换到其他选项。两个哲学截然相反的选项如下:
  • psftp:命令行工具,您可以从批处理脚本中调用;psftp是PuTTY软件包的一部分,您可以在此处找到它http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
  • Syncplify.me FTP Script:可编写脚本的FTP/S和SFTP客户端,适用于Windows,允许您将密码存储在加密的“配置文件”中;请在此处查看http://www.syncplify.me/products/ftp-script/
无论哪种方式,强烈建议从密码身份验证转换为PKI身份验证。

0

这个命令将会帮助你

sshpass -p MYPASSWORD sftp MYUSERNAME@HOST

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接