我正在 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
你必須區分兩件事:
- 世界衛生組織建立 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 手冊。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