概述

概述

我正在 AWS 上使用两个 ubuntu 实例(我使用 pem 密钥来访问它们)。

我为两个实例设置了 rsync,如果我使用默认用户 ubuntu@ipaddress,它就可以工作。但是,如果我尝试与其他用户一起使用 rsync(sudo su - jenkins例如,我正在输入,甚至sudo在 rsync 命令之前输入),则会出现以下错误。

Permission denied (publickey).
rsync: connection unexpectedly closed (0 bytes received so far) [Receiver]
rsync error: unexplained error (code 255) at io.c(226) [Receiver=3.1.0]

我已采取的步骤:

我尝试在登录时创建一个 ssh 密钥(使用 ssh-keygen),jenkins并将其添加到authorized_keys文件中/home/ubuntu/.ssh/authorized_keys(我从中运行 rsync 的地方)甚至$JENKINS_HOME/.ssh/authorized_keys(我也尝试从那里运行 rsync 的地方)。

我什至尝试使用 pem 密钥来做同样的事情,但这也不起作用。

这就是我想要运行的

rsync -avuh --delete -e ssh jenkins@ipaddress:/var/lib/jenkins/* /var/lib/jenkins

这是密钥文件

rsync -avuh --delete -e 'ssh -i path/to/key.pem' [email protected]:/var/lib/jenkins/* /var/lib/jenkins

PS:我不想用 ubuntu 用户运行它的唯一原因是因为我得到了failed: Permission denied (13)很多东西(因为这些文件归 jenkins 所有)。

最终目标:

我试图通过执行 cronjob 来保持备份 jenkins 实例与主实例不断备份:

*/30 * * * * /usr/bin/rsync -avuh --delete -e ssh root@jenkinsprimary:/var/lib/jenkins/* /var/lib/jenkins

答案1

你必须区分两件事:

  • WHO建立 SSH 连接
  • 哪个远程用户拥有文件您想要复制的内容。

概述

(srcmachine)  (rsync)   (destmachine)
  srcuser    -- SSH -->   destuser
                             |
                             | sudo su jenkins
                             |
                             v
                          jenkins

假设您想要 rsync:

  • 从:
    • 机器:srcmachine
    • 用户:srcuser
    • 目录:/var/lib/jenkins
  • 到:
    • 机器:destmachine
    • 用户:destuser建立 SSH 连接
    • 目录:/tmp
    • 最终文件所有者:jenkins.

解决方案

rsync --rsync-path 'sudo -u jenkins rsync' -avP --delete /var/lib/jenkins destuser@destmachine:/tmp

说明

     --rsync-path=PROGRAM    specify the rsync to run on the remote machine

诀窍是告诉rsync使用另一用户 ( ) 在远程计算机上运行jenkins,​​而不是建立 SSH 连接的用户 ( destuser)。

要求

SSH 访问

(srcmachine)         (rsync)   (destmachine)
  srcuser           -- SSH -->   destuser

[~/.ssh/id_rsa]                [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside
[~/.ssh/id_rsa.pub]

不要忘记限制以下权限~/.ssh

chmod 700 ~/.ssh

苏多尔为destuser

必须destuser有特权才能做sudo -u jenkins rsync

一般来说,我们将 设为destuser的成员sudoers。为此,请在root@上destmachine

cat > /etc/sudoers.d/destuser << EOF
destuser ALL=(ALL) NOPASSWD:ALL
EOF

要在之前测试它rsync,您可以登录destuser@destmachine并运行以下命令:

sudo su jenkins
echo $USER

如果返回:

jenkins

这意味着您以jenkins用户身份登录,并且意味着您的rsync命令也将起作用,因为升级权限jenkins起作用。

注意一个糟糕的解决方案:与目标用户建立 SSH 连接jenkins

我们为什么不这样做呢?

(srcmachine)         (rsync)   (destmachine)
  srcuser           -- SSH -->    jenkins

[~/.ssh/id_rsa]                [~/.ssh/authorized_keys] <-- "id_rsa.pub" inside
[~/.ssh/id_rsa.pub]

因为它jenkins是一个“服务”帐户,这意味着它运行一个服务,该服务公开一个端口(80或其他)以供外部 HTTP 访问,并且这意味着通过 HTTP 的 Jenkins 服务获取访问权限可能存在安全漏洞。

这就是为什么我们有www-data用户和类似人来运行不同的服务。如果他们暴露的端口遭到黑客攻击,他们就无能为力:

  • 一切对他们来说都是只读的。
  • 除了写在/var/log/THE_SERVICE.

因此,允许jenkins用户进行 SSH 访问会暴露表面攻击(SSH 访问也是如此root!!)。

此外,如果您想以其他用户身份进行 rsync(rootwww-data等),则必须将 SSH 密钥公钥复制到这些帐户(很麻烦)。

好的解决方案: 你应该设置尽可能少地对用户帐户进行 SSH 访问destuser) 那可以升级到您想要的“服务”帐户(jenkinsroot等)。

答案2

我作为另一个用户在 rsyncing 时遇到了类似的问题。通过运行下一个命令解决了这个问题:

rsync -avu -e "ssh -i my-key -o StrictHostKeyChecking=no -l user-i-want-to-use-in-rsync" ./local_dir remote_host:remote-host-dir

请注意,也许您需要使用按键才能以其他用户身份运行 rsync。

答案3

sudo -u jenkins -i rsync ...

没有引号

-i选项使sudo命令在用户的环境中运行,包括 ssh 密钥等.profile.bash_profile

来自sudo男人:

-i, --login

运行由目标用户的密码数据库条目指定的 shell 作为登录 shell。这意味着shell 将读取特定于登录名的资源文件,例如 .profile.bash_profile或。.login如果指定了命令,则会通过 shell 的-c选项将其传递到 shell 执行。如果未指定命令,则执行交互式 shell。 sudo在运行 shell 之前尝试更改到该用户的主目录。该命令在与用户登录时收到的环境类似的环境中运行。请注意,与交互式会话相比,指定命令时大多数 shell 的行为有所不同;有关详细信息,请参阅 shell 手册。sudoers(5)手册中的命令环境部分记录了-i在使用 sudoers 策略时该选项如何影响命令运行的环境。

答案4

我有类似的问题。
我使用 cron 解决了这个问题。但 cron 必须以特定用户运行(例如:jenkins)

只需让 cron 工作:

$ crontab -u jenkins -e

然后根据您的需要填写 cron 。

*/2 * * * * sh /home/user/scp.sh 2>&1 >> /home/user/errmail.log

相关内容