通过 ssh 在 rsync 之前使用 sudo 远程挂载磁盘

通过 ssh 在 rsync 之前使用 sudo 远程挂载磁盘

搜索这个网站对我来说非常有帮助,但我已经在这个问题上停留了一段时间。如果事情太琐碎,我提前道歉。

我有两台 CentOS 7 服务器,A 和 B。从服务器 A,我需要定期通过 ssh 将数据 rsync 到服务器 B 的磁盘上,而该磁盘大多数时候都没有挂载,所以我的A 端 cron'ed bash 脚本不得不挂载B面盘第一的。

我考虑过以相反的方式做事(让 B 端 cron 任务挂载磁盘并从 A 同步数据),但由于与应用程序相关的原因,A 到 B 方向更有意义。简而言之,B 事先并不知道要 rsync 的(大量)文件夹或要挂载的磁盘。只有 A 拥有此信息并知道数据集何时一致并准备好进行 rsync。

当然,服务器 B 上的 ssh-LogAsRoot 不是一个选项,所以我正在考虑使用限制操作的 sudo:我在服务器 B 上定义了一个特定用户(rsync_user),并赋予他无需密码即可 sudo-mount 的权利:

[serverB]# cat /etc/sudoers.d/rsync_user.conf
rsync_user ALL=NOPASSWD:/usr/bin/mount /dev/md13 /data_mnt

从命令行测试原理,我希望这能完成这项工作:

[root@serverA]# ssh -i keyfile rsync_user@serverB 'sudo /usr/bin/mount /dev/md13 /data_mnt'
...欢迎来到服务器B...
[sudo] rsync_user 的密码:

服务器 B 不断询问 sudo 密码。

我试图把须藤挂载...rsync_user .bashrc 中的命令而不是通过 ssh 传递它,结果相同。通过 ssh 使用 NOPASSWD-sudo 是否有任何限制,或者我是否在 sudoer 配置行中遗漏了某些内容?

我读到了 ssh 的 -t“pseudo tty”开关,并了解它在交互式会话中的用途,但我不知道它如何在脚本化连接中提供帮助。

在此阶段,我正在考虑在 A 和 B 之间设置某种基于文本文件的命令/响应交换,例如让 rsync_user 通过 ssh 在服务器 B 上的文本文件中提升标志,以及短期监控服务器 B 的 root-task 会检测到此标志来安装所需的磁盘,并在完成后向服务器 A 发出信号......但我确信有一种更简单、内置且安全的方法来执行此操作。

那么,我使用“sudo mount”方法是否走在正确的道路上,或者您会推荐另一种方法吗?

答案1

我会选择将command其放入远程的选项.ssh/authorized_keys,并根据请求的路径调用一个包装器同步将通过安装磁盘sudo(或者更好地调用另一个包装器,因为sudo通配符sudo非常可怕),然后基于SSH_ORIGINAL_COMMAND将完成其余的工作。

command="sh $HOME/bin/rsync_wrapper" ssh-rsa ... rsync-job

您应该研究如何在远程主机上调用 rsync。您可以了解这个 Sambarsync包装器是如何工作的https://www.samba.org/ftp/unpacked/rsync/support/rrsync(即 rsync 客户端调用远程节点,rsync --server --sender -vlogDtpr --partial . <ARGS>可通过 访问SSH_ORIGINAL_COMMAND)。

相关内容