無需指定密碼即可在系統之間 Rsync 根文件

無需指定密碼即可在系統之間 Rsync 根文件

這對我來說似乎很棘手。

我已經設置了兩個系統,以便我可以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 的文件,而不指定密碼,條件是,

  1. root帳戶在兩個系統上都被鎖定。即,沒有root密碼。成為 root 的唯一方法是透過sudo(建議的安全實踐,請參閱http://help.ubuntu.com/community/RootSudo
  2. 我不想完全無密碼sudo,但也不想一直輸入密碼。
  3. 普通非特權使用者已將其 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

解決方案。

  1. 將使用者的 ssh 金鑰新增至遠端 root 可以工作,但只完成了一半,即現在rsyn ... root@remote:...可以工作。具有挑戰性的部分是找到sudo rsyn ...工作。
  2. 要開始sudo rsyn ...工作,需要的是 -- 使用 SSH 代理進行 sudo 身份驗證,http://www.evans.io/posts/ssh-agent-for-sudo-authentication/
  3. 要在 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

現在您應該能夠執行無密碼sshrsync(以 root 身分),如下所示:

rsync /path/to/local xpt@remote

如果兩個系統上的檔案都需要由 root 擁有,那麼事情就會變得更加複雜。最簡單的方法就是在兩個系統上設定 root 密碼:

sudo -i
passwd 

現在您可以按照您的意願以 root 身分登入。

當然,最好的要做的事情是不以 root 身分透過網路複製文件。我真的無法想像為什麼你會想要這樣做,而且風險並不值得付出努力,只需複製文件並sudo在複製後根據需要使用即可。


更新:

我再說一遍,最簡單的方法是為每台電腦建立 root 密碼,然後以 root 身分複製。我不明白你為什麼不想要​​這個,它就像運行一樣簡單sudo passwd

無論如何,如果您堅持不想創建 root 密碼,我能看到的唯一解決方法是運行兩個命令:

  1. 執行rsync複製到使用者可寫目錄(我用來mktmp建立隨機目錄名稱):

    dir=`mktemp -u`; && sudo rsync -avz /root xpt@remote:$dir
    
  2. 將內容移至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-keygenssh-copy-id就像我在開始時描述的那樣。您仍然需要輸入兩個sudo命令的密碼,一次用於本地計算機,一次用於遠端計算機。

相關內容