在远程服务器上运行命令会将结果返回到本地以处理并在远程服务器上运行另一个命令

时间:2019-02-06 09:40:11

标签: ssh find remote-server scp

我发现很难把头缠起来。

我正在尝试完成一个非常简单的事情,即通过本地计算机上的脚本定期将文件从一个Linux系统复制到另一个Linux系统。

远程系统的内存非常有限,因此不支持cron或许多常见的库。唯一的办法是永远运行一个脚本,而我不希望这样做。它确实有scp和ssh连接到它

我想从本地计算机SSH到远程计算机,对不到一天的所有文件运行find命令。

然后我要使用此结果并以

的形式进行处理
scp someone@somewhere.com:"file1.sh file2.txt file3.jpg" /destination

目标是本地位置。如果我可以重命名文件以在目标文件夹中包含文件的完整路径作为其名称,那就更好了。

编辑1:

一些进步,我使用以下命令来获取要复制的文件列表

ssh root@192.168.0.3 'cd /tmp && find -name *.mp4 -mtime -1'

我确实必须手动输入密码,这样它才能作为脚本的一部分运行

1 个答案:

答案 0 :(得分:0)

SSH,无需输入密码

要在不输入密码的情况下执行传输,您必须确定哪台计算机应该信任另一台计算机。如果两个主机分别是SRC(带有文件的主机)和DEST(将复制内容的主机),则SRC必须信任DEST,或者DEST必须信任SRC(或两者!)。

让我们说SRC将信任DEST,但我们不希望DEST信任SRC。

要在没有用户交互的情况下连接和运行副本,您将必须在DEST上存储与未加密密码等效的内容。出于明显的原因,这不是一个好主意,但是有一些方法可以最大程度地降低风险。

一种选择是安装诸如sshpass之类的命令,但实际上您将需要保留未加密的密码,因此,除非确实需要,否则我建议不要使用此方法。

更好的方法是在两台机器之间设置公共密钥身份验证。通常,您会生成一个私钥,并以加密方式存储。您可以输入密码以将其解锁,或者将其解锁一次并加载到ssh-agent之类的程序中。后者可能是更可取的方法(密钥未加密地存储在内存中,但是攻击者必须已经获得root访问权才能使用它。显然,具有root访问权的人可能会记录您键入密码的行为)。

我们可以通过存储未加密的私钥来避免初始密码输入。如果我们不采取特殊的预防措施,那么显然在DEST上未加密存储私钥就等于把密码留给了SRC。这是不好的。为了最大程度地降低风险,我们可以配置SRC,使其不允许DEST连接和运行任意命令。我们可以指定只允许一个命令(我们称之为COMMAND)。如果我们小心的话,这会在一定程度上减轻风险。

配置OpenSSH

因此,我们决定将DEST配置为无需输入任何密码即可在SRC上运行COMMAND。在Linux上,我们可能正在使用openssh。这是一种设置方法:

  1. 在DEST上创建密钥对:
dest:~$ cd ~/.ssh
dest:~/.ssh$ ssh-keygen -b 2048 -t rsa -N '' -f src-cmd
  1. 将公钥复制到SRC,以限制使用特定命令:
dest:~/.ssh$ ( echo -n 'command="/home/usr/mkfilelist" '; cat src-cmd.pub ) |\
        ssh usr@src 'mkdir -p .ssh; cat >> .ssh/authorized_keys'
  1. 现在可以从DEST在SRC上运行命令/home/usr/mkfilelist(如果存在!)而无需输入密码:
dest$ ssh usr@src -i ~/.ssh/src-cmd

为获得更高的安全性,请考虑使用from=DEST,command=...,以便仅允许来自DEST的连接。有关详细信息,请参阅:authorized_keys(5)。

收集文件

现在我们需要写/home/usr/mkfilelist

这几天,rsync是一个很好的程序,可以在两组文件夹之间同步文件,但是我要假设SRC提供了历史悠久的UNIX主食:cpio

cpio读取stdin上的文件名列表并输出一个“存档”,或读取一个“存档”并创建文件。这将非常适合您的find命令:

#!/bin/bash

cd /PATH/TO/SRCFILES
find . -mtime -1 -name '*.mp4' -type f -print | cpio -o

要注意的重要一点是,这会将“存档”输出到stdout(因此,除非重定向到文件,否则不要尝试运行它)。还要注意,您应该确保find 不输出任何以/开头的文件路径(因此cd和使用.的使用)。

修改您的查找条件以品尝并保存为/home/usr/mkfilelist在SRC上。

使其可执行(chmod +x /home/usr/mkfilelist)。

将它们放在一起

现在,我们可以将这些内容整理成一个脚本,您可以在DEST上从cron运行该脚本:

#!/bin/bash

cd /PATH/TO/DESTFILE
ssh usr@src -i ~/.ssh/src-cmd | cpio -i

这将连接到SRC,从而导致生成“存档”。该文件将通过管道传递到运行在DEST上相应文件夹中的cpio中,以提取文件。