2014-06-27 99 views
1

我需要将一组文件上传到sftp帐户。带有bash的sftp/scp文件

我的第一个想法是使用PHP的ssh2_connect()函数,我能够在本地得到这个工作没有问题。但是,一旦我转移到开发环境,我很快意识到这不是一个好的解决方案,因为太多的依赖关系不存在,安装它们将需要太多人的太多批准。

所以,我的下一个想法是使用bash,这是我需要帮助的地方。我将通过cron每小时运行这个bash脚本,因此它需要无人值守。但是,当我运行sftp/scp时,它需要密码。

sftp帐户不允许ssh连接,所以我无法创建授权密钥。我不想依赖远程机器上的.ssh文件夹。

任何建议,将不胜感激。

请记住,我不能安装任何东西,所以没有钥匙串,sshpass或期望。在How to run the sftp command with a password from Bash script?中发现的所有其他答案都不可行,因为我无法在服务器上安装任何东西。

+1

@anubhava这不是重复的,因为你所提供的职位不回答我的问题 –

+0

其实它的作用。请花一些时间阅读答案。它允许您使用建议的各种方式从shell * unattended *运行sftp/scp。 – anubhava

+1

@anubhava我在我的帖子中也提到该帖子的答案对我的情况不适用,因为我无法使用密钥或在服务器上安装任何东西。 –

回答

1

最初我试图使用PHP的ssh2_connect(),因为php创建了我需要上传的文件。因为这个原因,最好在我的php脚本中有这个sftp事务,但是由于它不起作用,我转向bash。

我的解决方案实际上是使用PHP和卷曲:

$ch = curl_init(); 

$fp = fopen($file, "r"); 

curl_setopt($ch, CURLOPT_URL, "sftp://USER:[email protected]/" . basename($file)); 
curl_setopt($ch, CURLOPT_UPLOAD, 1); 
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_SFTP); 
curl_setopt($ch, CURLOPT_INFILE, $fp); 
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file)); 

curl_exec($ch); 

curl_close($ch); 
0

检查lftp,它是非常强大的文件传输工具。例如:

lftp -u "$username","$password" -e "cd /desc/path; put $FILE; bye" sftp://remote.example.com 

还检查mput,lftp手册中的镜像。

顺便说一句。如果你使用expect,我认为你不需要在远程服务器上安装任何东西。无论如何,我正在使用lftp而不是在大多数类似情况下工作的期望。

+0

lftp没有安装在服务器上。查看以前的帖子 –

+0

@ScottJoudry我可能对此有错,但我很确定'lftp'是一个客户端程序,并且您只需要一台运行在服务器端的SFTP服务器。 – Piccolo

+0

我将文件从一台服务器上传到另一台服务器,源服务器没有安装lftp。 –