我正在 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(root
、www-data
等),则必须将 SSH 密钥公钥复制到这些帐户(很麻烦)。
好的解决方案: 你应该设置尽可能少地对用户帐户进行 SSH 访问(destuser
) 那可以升级到您想要的“服务”帐户(jenkins
、root
等)。
答案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