
這對我來說似乎很棘手。
我已經設置了兩個系統,以便我可以rsync
像我一樣在它們之間傳輸文件,而無需指定密碼。現在的問題是rsync
屬於root
.在我的兩個系統上,都沒有 root 密碼。成為 root 的唯一方法是透過sudo
。所以我既不能給密碼sudo rsyn local root@remote:
,也不能使用我的 ssh-agent 來提供密碼短語。我不想在任何系統上設定 root 密碼;我確實需要兩個系統上的檔案都由 root 擁有。
編輯:使用屬於的檔案root
只是一個範例,我需要一種方法讓我的非特權帳戶輕鬆讀取/寫入系統(包括 root 擁有的)檔案。一個範例是將我配置的 /root 環境複製到新安裝的系統中。這兩個系統實際上是單一主機下的兩個虛擬機,因此在它們之間複製根擁有的檔案對我來說並不是一個大問題。
編輯2:如果我只想將配置的 /root 環境複製到新安裝的系統中,我可以使用 tar:
sudo tar cvzf - /root | ssh me@remote sudo tar xvzf - -C /
但我確實需要rsync
不時更新。有什麼簡單的方法可以實現這一點嗎?
編輯3:正式提出問題
好吧,這一切都始於一個問題,如何以rsync
普通非特權使用者身分在兩個系統之間存取屬於 root 的文件,而不指定密碼,條件是,
- 該
root
帳戶在兩個系統上都被鎖定。即,沒有root
密碼。成為 root 的唯一方法是透過sudo
(建議的安全實踐,請參閱http://help.ubuntu.com/community/RootSudo) - 我不想完全無密碼
sudo
,但也不想一直輸入密碼。 - 普通非特權使用者已將其 ssh 密碼輸入到 ssh 代理程式中。
謝謝
答案1
您可以直接使用 rsync 來創造性地使用--rsync-path
選項。所以你會使用:
rsync -a -e "ssh" --rsync-path="sudo rsync" localdir/ [email protected]:/remotedir
請注意,這要求遠端主機上的“sudo rsync”不會要求輸入密碼。這可以透過多種方式實現:
- 在執行 rsync 之前在遠端執行操作
sudo -v
(非常適合一次性 rsync 作業)。您的 sudo 不得使用tty_tickets
選項才能使其運作。 - 放在遠端主機上
username ALL= NOPASSWD:/usr/bin/rsync
。/etc/sudoers
- 使用pam-ssh-代理身份驗證在遙控器上
/etc/pam.d/sudo
當然,您也可以使用「守護程式模式下的 rsync」(例如,請參閱 Debian GNU/Linux 上的rsyncd.conf(5)
和)來代替「rsync over ssh」來完成您想要的任務,並具有更快的傳輸速度的額外好處。/etc/default/rsync
答案2
解決方案。
- 將使用者的 ssh 金鑰新增至遠端 root 可以工作,但只完成了一半,即現在
rsyn ... root@remote:...
可以工作。具有挑戰性的部分是找到sudo rsyn ...
工作。 - 要開始
sudo rsyn ...
工作,需要的是 -- 使用 SSH 代理進行 sudo 身份驗證,http://www.evans.io/posts/ssh-agent-for-sudo-authentication/ - 要在 Ubuntu 下安裝 pam-ssh-agent-auth PAM 模組,您可以使用我剛剛建立的 ppa,https://launchpad.net/~suntong001/+archive/ppa。在 Ubuntu 12.04 Precision 和 13.10 saucy 下測試良好。
華泰
答案3
另一種方法是在兩台伺服器上建立一個 .sh 腳本,其中包含 rsync 腳本。
然後透過 cronjob 或透過 ssh 運行它們:
ssh not-your-root-user@remoteserver sudo sh your-rsync-script.sh
或直接透過 ssh 執行 rsync 腳本
ssh not-your-root-user@remoteserver sudo rsync local root@remote
如果它是預定的 rsync 作業,我更喜歡 cronjob。
答案4
這取決於你想做什麼。這些檔案是否需要由兩個系統上的 root 擁有?如果您只是進行備份,那麼您就可以rsync
以 root 身分執行,但以普通使用者身分登入遠端伺服器,則它們不會。
建立本機金鑰root
以作為遠端普通使用者登入(我將用作xpt
您的普通使用者名稱):
sudo -i
ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub xpt@remote
現在您應該能夠執行無密碼ssh
或rsync
(以 root 身分),如下所示:
rsync /path/to/local xpt@remote
如果兩個系統上的檔案都需要由 root 擁有,那麼事情就會變得更加複雜。最簡單的方法就是在兩個系統上設定 root 密碼:
sudo -i
passwd
現在您可以按照您的意願以 root 身分登入。
當然,最好的要做的事情是不以 root 身分透過網路複製文件。我真的無法想像為什麼你會想要這樣做,而且風險並不值得付出努力,只需複製文件並sudo
在複製後根據需要使用即可。
更新:
我再說一遍,最簡單的方法是為每台電腦建立 root 密碼,然後以 root 身分複製。我不明白你為什麼不想要這個,它就像運行一樣簡單sudo passwd
。
無論如何,如果您堅持不想創建 root 密碼,我能看到的唯一解決方法是運行兩個命令:
執行
rsync
複製到使用者可寫目錄(我用來mktmp
建立隨機目錄名稱):dir=`mktemp -u`; && sudo rsync -avz /root xpt@remote:$dir
將內容移至
remote:/root
ssh -t lacoloc@badabing sudo rsync -avz "$dir"/* /root
此
-t
選項強制 tty 分配,並且是sudo
在遠端系統上執行命令所必需的。
您可以透過將其添加到您的文件中來組合兩者~/.bashrc
(如果您不使用 bash,請告訴我):
function Rrsync(){
dir=`mktemp -u` &&
sudo rsync -avz $1 $2:$dir &&
ssh -t $2 sudo rsync -avz $dir/ $3 && rm -rf $dir
}
然後您可以像這樣呼叫該函數:
Rrsync /root xpt@remote /root
------ ----- ---------- -----
| | | |---> The target directory on the remote server
| | |------------> username@server
| |--------------------> Path to local source directory
|--------------------------> The function name
請記住,您可能需要/
在 rsync 來源和目標中新增/刪除尾部斜杠,具體取決於您是複製目錄還是目錄內容。看man rsync
。
為了讓它在沒有密碼的情況下工作,你必須以 root 身份運行ssh-keygen
,ssh-copy-id
就像我在開始時描述的那樣。您仍然需要輸入兩個sudo
命令的密碼,一次用於本地計算機,一次用於遠端計算機。