我需要从Linux主机使用sftp将日志文件传输到远程主机。我的操作组已为我提供了相同的凭据。但是,由于我无法控制其他主机,因此无法生成RSA密钥并与其他主机共享。

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

我发现了一个类似的堆栈溢出问题,在bash脚本中指定sftp的密码,但对于我的问题没有令人满意的答案。

除了使用公钥身份验证之外,您还有几个选项:

使用钥匙链

使用sshspass(安全性较低,但可能满足您的要求)

使用Expect(安全性最低,需要更多编码)

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

export SSHPASS=your-password-here

sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !

cd incoming

put your-log-file.log

bye

!

用于Mac:stackoverflow.com/questions/9102557/&hellip;

嗨,我也有类似的问题,我尝试使用expect,因为主机上没有其他的替代方案。有了EDOCX1[0]我就得到了这个错误。Permission denied (publickey,keyboard-interactive).。请告诉我如何使用bash脚本中的passwd连接到sftp主机。

请看,我在这里问过这个问题。stackoverflow.com/q/12508206/1135954

我想不需要出口。SSHPASS=password sshpass -e ...应该这样做。

@詹斯:同意这里不需要出口。

我可以用一行程序加载一个日志文件:sshpass -p"my_password" sftp -oPort=9999 user@host:dir/file.log。

@Gorus:一行程序非常酷,但是我不想在命令行上使用密码,因为这样会增加窥探风险。

@德鲁:是的,export SSHPASS=your-password-here进入了该用户的env,但是ps -ef如何显示不同用户的env?

埃多克斯1〔7〕是我最重要的缺件。

这对我不起作用…

你用了什么没用。既然这是一条非常古老的线索,请随意创建一个新问题。

嗨,阿努巴瓦-这是我的问题。stackoverflow.com/questions/24540156/&hellip;

我正在IBMAIX上工作,并尝试使用sftp命令从远程服务器获取文件…

嗨,阿努巴瓦-你能帮我讲讲这个剧本吗?我试过用,但没用。这是我在下面的链接中编写的代码。stackoverflow.com/questions/24540156/&hellip;

嗨,阿努巴瓦-运气好吗?

嗨,阿努巴瓦-我试过这三种方法,但没有一种对我有用……你能帮我一下吗?谢谢您。。。

在尝试sshpass命令时出现了什么错误?我每天都在我的系统上使用它。

sshspass:找不到命令-我找不到它

我在那台机器上没有安装新软件的根用户。我正在寻找一种不安装新软件的方法

我在没有根访问的情况下安装了它,但是讨论这将使这个问题偏离太多。

嗨,sshspass是个好主意,谢谢,工作得很好!但现在,每次通过crontab运行时,我都会收到一封邮件,其中包含这里脚本区域中的所有sftp命令。那么,有人知道如何抑制这个输出到控制台吗?

可以添加> ~/file.out 2>&1将输出和stderr重定向到文件。

@阿努巴瓦,谢谢,这个很好用!

@阿努巴瓦非常感谢你的回答。我将它与我的bash脚本文件一起使用,该文件是通过crontab-e启动的。我更改了感叹号"!"到"eof",因为crontab无法在脚本中识别此字符

另一种方法是使用LFTP:

lftp sftp://user:password@host  -e"put local-file.name; bye"

这种方法的缺点是,计算机上的其他用户可以从诸如ps之类的工具中读取密码,并且密码可以成为shell历史的一部分。

由于LFTP 4.5.0设置了LFTP_PASSWORD环境变量,并使用--env-password执行了LFTP,因此提供了一种更安全的替代方案。下面是一个完整的例子:

LFTP_PASSWORD="just_an_example"

lftp --env-password sftp://user@host  -e"put local-file.name; bye"

LFTP还包括一个很酷的镜像功能(可以包括确认传输后删除"--remove source files"):

lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com

+1用于建议替代方案,但我们是否可以避免在命令行上提供密码?

拒绝向同一台计算机上的任何人显示密码

您可以为lftp创建脚本文件,这样就不必在命令行中提供密码。创建一个文件put-script:open sftp://user:password@host; put local-file.name; exit,然后运行lftp -f put-script,这样就不必在命令行中使用用户名和密码,并且可以设置对脚本文件的限制权限。

@这是个好主意。我想知道是否要将它作为别名或函数添加到我的环境变量中,是否安全并可以对其他用户隐藏它?

做lftp要比和sftp和sshpass混在一起容易得多。好答案。

Expect是一个很好的程序。

在Ubuntu上安装:

sudo apt-get install expect

在CentOS机器上安装:

yum install expect

假设您希望连接到SFTP服务器,然后将本地文件从本地计算机上载到远程SFTP服务器。

#!/usr/bin/expect

spawn sftp username@hostname.com

expect"password:"

send"yourpasswordhere

"

expect"sftp>"

send"cd logdirectory

"

expect"sftp>"

send"put /var/log/file.log

"

expect"sftp>"

send"exit

"

interact

这将使用您的服务器密码打开一个SFTP连接。

然后它会转到要上载文件的目录,在本例中是"logdirectory"

这会将一个日志文件从/var/log/中找到的本地目录上载到远程服务器上的"log directory",文件名为file.log。

谢谢你的回答,我希望这是我完成这项任务的一个选择。

谢谢您。我通过搜索找到了你的答案,使用它并成功地用Expect构建了一个脚本。刚刚发布了关于权力的剧本

非常感谢你的回答,我已经投了反对票:)

这对我来说毫无瑕疵。谢谢您!

我用这个输入ssh私钥的密码。在所有服务器上放置相同的公钥并定期旋转私钥密码短语更容易。

您可以在shell脚本中交互使用lftp,这样密码就不会保存在.bash_历史记录或类似文件中,方法是执行以下操作:

vi test_script.sh

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

#!/bin/sh

HOST=

USER=

PASSWD=

cd

lftp<

open sftp://$HOST

user $USER $PASSWD

put local-file.name

bye

END_SCRIPT

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

要覆盖现有文件,请在lftp<

您可以通过启用无密码身份验证进行覆盖。但你应该先安装密钥(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

+1问你的答案,但问题是在没有公钥/私钥的情况下进行。

哎呀。。刚刚看到密钥共享的限制:)

出于好奇,当从shell脚本调用时,这个命令lftp -p ${port} -u ${login_id},${password} ${ip_number}会在哪里打印它们?除了sshspass,你是怎么解决的?

我没有lftp,并且同时依赖Mac和Linux的sshpass。

纯金。谢谢!:)

提示:如果要为其他远程服务器设置此设置,请将相同的id_rsa.pub复制到远程服务器。公钥id_rsa.pub在本地服务器上生成一次,并与需要设置无密码身份验证的所有远程主机共享。

我最近被要求从ftp切换到sftp,以确保服务器之间的文件传输安全。我们使用的是tectia ssh包,它有一个选项--password来在命令行上传递密码。

示例:sftp --password="password""userid"@"servername"。

成批实例:

(

echo"

ascii

cd pub

lcd dir_name

put filename

close

quit

"

) | sftp --password="password""userid"@"servername"

我想我应该分享这些信息,因为在运行帮助命令(sftp -h之前,我查看了各种网站,我很惊讶地看到了密码选项。

+给你一个好建议。但是,这将要求您在命令行上传递密码,系统中执行ps命令的任何人都可以看到您的密码。

我试过了,我找到了EDOCX1[0]

@我可能是因为你需要techia ssh,而不是openssh

将sshspass与一个锁定的凭证文件结合起来,实际上,它的安全性与任何东西都一样——如果您在框中有根来读取凭证文件,那么所有的赌注都将关闭。

您可以使用sshspass。以下是步骤

为Ubuntu-sudo apt-get install sshpass安装sshass

如果是第一次,请将远程IP添加到已知主机文件中对于Ubuntu->ssh user@ip->enter'yes'

为它发出scp和sshspass的组合命令。下面是一个针对远程Tomcat的战争应对示例代码sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps

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

#!/bin/bash

expect -c"

spawn sftp username@your_host

expect "Password"

send "your_password_here

"

interact"

您可能需要安装expect,将"password"的措辞更改为小写"p",以匹配您收到的提示。这里的问题是,它在文件和命令历史记录中以纯文本的形式公开您的密码。这几乎破坏了最初拥有密码的目的。

+1但我认为你清楚地说明了这种方法的问题所在。

Logo

更多推荐