我需要从Linux主机使用sftp传输日志文件到远程主机。我的行动组也向我提供了同样的证书。但是,由于我没有对其他主机的控制权,我不能生成并与其他主机共享RSA密钥。

那么,是否有一种方法可以从Bash脚本内部通过cron作业运行sftp命令(提供用户名/密码)?

我发现一个类似的堆栈溢出问题,指定密码sftp在Bash脚本,但没有满意的答案,我的问题。


当前回答

我发现最简单的方法来实现这一点,不需要安装任何第三方库,如Expect, SSHPASS…等等,是通过使用CURL和SFTP的组合。这两个程序几乎在每台Linux机器上都有。

这是在更改值之后应该执行的命令。

curl  -k "sftp://SERVER_IP:SERVER_PORT/FULL_PATH_OF_THE_FILE" --user "SERVER_USER:SERVER_PASSOWRD" -o "THE_NAME_OF_THE_FILE_AFTER_DOWNLOADING_IT"

例子:

curl  -k "sftp://10.10.10.10:77/home/admin/test.txt" --user "admin:123456" -o "test.txt"

解释:

我们正在使用用户名admin和密码123456连接到服务器10.10.10.10:77,以将文件/home/admin/test.txt从该服务器移动到您当前用于执行上述命令的服务器。

其他回答

除了使用公钥身份验证之外,您还有一些选择:

使用钥匙链 使用sshpass(安全性较低,但可能满足您的需求) 使用expect(安全性最低,需要编写更多代码)

如果你决定给sshpass一个机会,这里有一个工作脚本片段:

export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
   cd incoming
   put your-log-file.log
   bye
!

将sshpass与一个锁定的凭据文件结合起来,在实践中,它就像任何东西一样安全-如果您已经在盒子上使用root来读取凭据文件,那么无论如何,一切都是错误的。

您可以在shell脚本中交互式地使用lftp,这样密码就不会保存在.bash_history或类似的文件中,可以执行以下操作:

vi test_script.sh

将以下内容添加到文件中:

#!/bin/sh
HOST=<yourhostname>
USER=<someusername>
PASSWD=<yourpasswd>

cd <base directory for your put file>

lftp<<END_SCRIPT
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT

在编辑完put文件的主机、用户、pass和目录后,输入:wq,然后编写/退出vi编辑器,使脚本可执行chmod +x test_script.sh并执行。/test_script.sh。

Bash程序等待sftp请求密码,然后发送它:

#!/bin/bash
expect -c "
spawn sftp username@your_host
expect \"Password\"
send \"your_password_here\r\"
interact "

你可能需要安装expect,将“Password”改为小写“p”以匹配提示符接收到的内容。这里的问题是,它在文件和命令历史中以纯文本形式暴露了您的密码。这几乎违背了设置密码的初衷。

您可以通过启用无密码身份验证来覆盖。但是你应该先安装密钥(pub, priv)。

在本地服务器上执行以下命令。

Local $> ssh-keygen -t rsa 

按ENTER键显示所有选项。不需要输入任何值。

Local $> cd .ssh
Local $> scp .ssh/id_rsa.pub user@targetmachine:
Prompts for pwd$>  ENTERPASSWORD

使用以下命令连接到远程服务器

Local $> ssh user@targetmachine
Prompts for pwd$> ENTERPASSWORD

在远程服务器上执行以下命令

Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit

在本地服务器上执行以下命令测试无密码身份验证。 连接时应该没有密码。

$> ssh user@targetmachine