搜索这个网站对我来说非常有帮助,但我已经在这个问题上停留了一段时间。如果事情太琐碎,我提前道歉。
我有两台 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
)。