运行 远程服务器上的命令 return 结果到本地处理,运行 远程服务器上的另一个命令

Running commands on remote server return result to local to process and run another command on remote server

我发现很难理解这个问题。

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

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

我想从我的本地计算机通过 ssh 连接到远程计算机,运行 为不到一天的所有文件查找命令。

然后我想使用这个结果并以

的形式处理它
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'

不过我必须手动输入密码,所以这可以 运行 作为脚本的一部分

无需输入密码的 SSH

要在不输入密码的情况下执行传输,您必须决定哪台机器应该信任另一台。如果这两个主机是 SRC(包含文件的主机)和 DEST(副本所在的主机),则 SRC 必须信任 DEST,或者 DEST 必须信任 SRC(或两者!)。

假设 SRC 将信任 DEST 但我们不希望 DEST 信任 SRC。

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

一个选择是安装像 sshpass 这样的命令,但是你真的需要留下未加密的密码,所以我建议不要使用这种方法,除非你真的必须这样做。

更好的方法是在两台机器之间设置public-key认证。通常,您会生成一个加密存储的私钥。当你想使用它时,你输入一个密码来解锁它,或者你解锁一次并将它加载到像 ssh-agent 这样的程序中。后者可能是更可取的方法(密钥未加密存储在内存中,但攻击者必须已经获得 root 访问权限才能使用它。显然,具有 root 访问权限的人可以记录您输入的密码)。

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

配置 OpenSSH

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

  1. 在 DEST 上创建密钥对:
dest:~$ cd ~/.ssh
dest:~/.ssh$ ssh-keygen -b 2048 -t rsa -N '' -f src-cmd
  1. 将 public 密钥复制到 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 上的文件名列表并输出 "archive",或读取 "archive" 并创建文件。这将非常适合您的查找命令:

#!/bin/bash

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

需要注意的重要一点是,这会将 "archive" 输出到标准输出(所以不要尝试 运行ning 它,除非你重定向到一个文件)。另请注意,您应该确保 find 输出任何以 / 开头的文件路径(因此 cd 并使用 .)。

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

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

综合起来

现在我们可以将这些部分组合成一个脚本,您可以从 DEST 上的 cron 运行:

#!/bin/bash

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

这连接到 SRC,导致生成 "archive"。这是通过管道传输到 DEST 上适当文件夹中的 cpio 运行ning 中,用于提取文件。