从远程服务器向本地服务器传输SFTP文件

3

非常抱歉,如果这是一个太简单的问题。但是我是一名Java开发人员,对shell脚本毫无头绪。 我通过谷歌搜索,但并没有找到与我要求完全相符的结果。

我的需求

  1. 使用Sftp连接到远程服务器[基于公私钥的身份验证]。设置一个指向私钥文件的变量
  2. 将特定扩展名的文件[.log]传输到本地服务器文件夹。设置一个远程服务器路径和本地文件夹的变量
  3. 重命名在远程服务器上传输的文件
  4. 在一个.txt文件中记录所有传输的文件

有没有人能给我提供这方面的Shell脚本呢?

这是我目前从建议中框架出来的内容。 我仍然有些疑问 ;)

export PRIVKEY=${private_key_path}
export RMTHOST=user@remotehost
export RMTDIR=/logs/*.log
export LOCDIR=/downloaded/logs/
export LOG=sucess.txt

scp -i $PRIVKEY $RMTHOST:$RMTDIR $LOCDIR
for i in 'ls -1 $LOCDIR/*.log'
do
   echo $i >> $LOG
done

ssh $RMTHOST -c "for i in `ls -1 $RMTDIR; do mv /logs/$i /logs/$i.transferred; done"
2个回答

4

这种方法怎么样?

  1. 使用Sftp连接到远程服务器[基于公/私钥的认证]。使用一个变量指向私钥文件。
  2. 将特定扩展名为[.log]的文件传输到本地服务器文件夹。使用一个变量设置远程服务器路径和本地文件夹。
scp your_user@server:/dir/of/file/*.log /your/local/dir

记录所有传输的文件到一个 .txt 文件中。
for file in /your/local/dir/*.log
do
   echo "$file" >> $your_txt
done
  1. 将传输到远程服务器的文件重命名
ssh your_user@server -c "for file in /dir/of/file/*.log; do mv /dir/of/file/"$file" /dir/of/file/new_name_based_on"$file"; done"

请问您能否将其附加/编写为完整的脚本文件。除了ls和chmod [基本命令]之外,我对Linux脚本毫无头绪。 - RaceBase
如果任何文件传输失败,for循环如何知道它? - RaceBase
关于文件传输失败,有不同的方法:例如,您可以执行 2>/logfile,这将返回发生的错误。 - fedorqui
我读到了“基于公钥/私钥的身份验证”,所以我猜想不需要写密码。 - fedorqui
嗨。我已经更新了脚本。但我的问题是,在重命名文件之前,我们如何知道文件是否成功传输? - RaceBase
显示剩余5条评论

1
使用scp(secure copy)命令传输文件。您可能还想添加-C开关,该开关可压缩文件,从而可以加快速度。例如:从server1复制file1到server2,
在server1上:
#!/bin/sh scp -C /home/user/file1 root@server2.com:/home/user 编辑:
#!/bin/sh scp -i {path/to/pub/pri/key/file} /home/user/file1 root@server2.com:/home/user

坦白说,我对Shell脚本编程一无所知。作为一名Java开发人员,在当前的项目中遇到了这种情况,正在寻求帮助 :) - RaceBase
这个命令 scp -C /home/user/file1 root@server2.com:/home/user 是你需要在 shell 控制台中输入的,以便安全地将文件传输到远程服务器。由于 scp 基于 SSH,因此您需要进行身份验证。 - KiaMorot
正确的,需要身份验证。 - Tsimtsum
但是我们如何利用公钥身份验证呢?因为我们在这里没有提到任何内容。此脚本将由CRON作业运行。 - RaceBase

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