Linux:通过SSH连接自动化SFTP文件传输

3
我需要制作一个定时自动执行的crontab脚本,该脚本应该找到文件夹中最新修改的文件,然后通过SFTP连接将其传输到另一台机器上。 第一部分的问题已经通过提取所需文件的名称得到解决:
cd $myFolder
output=$(find . -type f -printf "%C@ %p\n" | sort -rn | head -n 1)
filename=$(echo $output | cut -d'/' -f 2)

但是第二部分比较困难,因为我无法找到在Linux sftp连接中以非交互方式输入$filename变量的方法,也无法以非交互方式输入用户名/密码。将其保存到临时文件中可能是一个不错的解决方案。

是否有更好的替代方案?

谢谢。

4个回答

3
你可以使用inotify监控目录并在修改时触发。文件名可以被传递给rsyncscp。例如:
inotifywait      \
  --quiet        \
  --event modify \
  --format '%f'  \
  --monitor watch_directory |
  while read FILE; do \
  scp watch_directory/$FILE host:/destination;
  done

inotify适用于与文件系统相关的事件实时同步,而rsync在执行时同步文件系统。scp命令是我所需的最佳选择。谢谢 - Luis Andrés García

2

您可以使用scp代替sftp——它使用相同的协议,但更适合非交互式使用。

如果目录中只包含文件(没有子目录),则只需使用ls即可找到目录中最后修改的文件:

output=$(ls -t "$myFolder" | head -1)

2
您可以使用curl通过sftp将文件上传到远程服务器,将登录凭据(用户名和密码)作为命令参数传递,示例如下:
curl -T uploadfilename -u username:password sftp://sitename.com/myfile

这是一个好主意,但我已经禁用了它:curl: (1) 协议sftp在libcurl中不受支持或被禁用。 - Luis Andrés García

0

我的解决方案:

获取文件名的方法:

filename=$(ls -t . | head -1)

将数据传输到远程服务器:

#!/usr/bin/expect -f

# A copy of the $sourceFile is sent to the $targetPath by using the scp command (secure copy)

set timeout 20

set sourceFile [lindex $argv 0]
set targetPath [lindex $argv 1]
set user [lindex $argv 2]
set password [lindex $argv 3]

# connect via scp
spawn scp $sourceFile "$user@$targetPath"
#######################
expect {
  -re ".*es.*o.*" {
    exp_send "yes\r"
    exp_continue
  }
  -re ".*sword.*" {
    exp_send "$password\r"
  }
}
interact

用户身份验证被委托给使用此脚本的脚本,并且可以通过在远程服务器上生成公钥/私钥RSA密钥对,然后使用它来完成:请阅读下一个链接:无密码SSH登录

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