我需要做 rsync的 ssh,并希望这样做自动无需通过密码的 ssh手动需要。
rsync
ssh
对于脚本化的 ssh 登录,您应该使用一个没有密码的密钥文件。这显然是一个安全风险,要注意密钥文件本身是充分安全的。
设置无密码 ssh 访问的说明
使用 ssh 键。
看看 ssh-keygen和 ssh-copy-id。
ssh-keygen
ssh-copy-id
之后,你可以这样使用 rsync:
rsync -a --stats --progress --delete /home/path server:path
虽然你现在已经实现了,
您还可以使用任何 期待实现(您可以在佩尔、 Python 中找到替代方案: pExpt、 parmiko 等)
你可以通过设置环境变量 RSYNC_PASSWORD为你想要使用的密码或使用 --password-file选项来避免在 rsync命令中出现密码提示。
RSYNC_PASSWORD
--password-file
使用“ sshpass”非交互式 ssh 密码提供程序实用工具
在 Ubuntu 上
sudo apt-get install sshpass
命令进行 rsync
/usr/bin/rsync -ratlz --rsh="/usr/bin/sshpass -p password ssh -o StrictHostKeyChecking=no -l username" src_path dest_path
另一个有趣的可能性是:
rsync --partial --progress --rsh="ssh -i dsa_private_file" host_name@host:/home/me/d .
注意: 我是 dsa _ private _ file是您的 RSA/DSA 私钥
基本上,这种方法非常类似于@Mad Scientist 所描述的方法,但是您不必将您的私钥复制到 ~/。嘘。换句话说,它对特别任务(一次无密码访问)很有用
如果不能使用公钥/私钥,可以使用 Expect:
#!/usr/bin/expect spawn rsync SRC DEST expect "password:" send "PASS\n" expect eof if [catch wait] { puts "rsync failed" exit 1 } exit 0
您需要将 SRC 和 DEST 替换为常规的 rsync 源和目标参数,并将 PASS 替换为密码。只要确保这个文件存储安全!
自动输入 rsync 命令的密码很困难。要避免这个问题,我的简单解决方案是挂载要备份的文件夹。然后使用本地 rsync 命令备份挂载的文件夹。
mount -t cifs //server/source/ /mnt/source-tmp -o username=Username,password=password rsync -a /mnt/source-tmp /media/destination/ umount /mnt/source-tmp
遵循 Andrew Seaford 提出的想法,这是使用 sshfs 完成的:
echo "SuperHardToGuessPass:P" | sshfs -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no user@example.com:/mypath/ /mnt/source-tmp/ -o workaround=rename -o password_stdin rsync -a /mnt/source-tmp/ /media/destination/ umount /mnt/source-tmp
我使用 VBScript 文件在 Windows 平台上完成这项工作,它为我提供了很好的服务。
set shell = CreateObject("WScript.Shell") shell.run"rsync -a Name@192.168.1.100:/Users/Name/Projects/test ." WScript.Sleep 100 shell.SendKeys"Your_Password" shell.SendKeys "{ENTER}"
下面这些对我有用:
SSHPASS='myPassword' /usr/bin/rsync -a -r -p -o -g --progress --modify-window=1 --exclude /folderOne -s -u --rsh="/usr/bin/sshpass -p $SSHPASS ssh -o StrictHostKeyChecking=no -l root" source-path myDomain:dest-path >&2
我不得不安装 sshpass
sshpass
我让它这样工作:
sshpass -p "password" rsync -ae "ssh -p remote_port_ssh" /local_dir remote_user@remote_host:/remote_dir
当我第一次访问时,官方的解决方案(以及其他方案)是不完整的,所以多年后,我回来发布了这个替代方案,以防万一有其他人在这里打算使用公钥/私钥对:
从目标备份计算机执行此操作,该计算机将从源备份拉到目标备份
rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' user@10.9.9.3:/home/user/Server/ /home/keith/Server/
从源计算机执行此操作,该计算机将从源发送到目标备份
rsync -av --delete -e 'ssh -p 59333 -i /home/user/.ssh/id_rsa' /home/user/Server/ user@10.9.9.3:/home/user/Server/
而且,如果您没有为 ssh 使用备用端口,那么请考虑下面更优雅的示例:
在目标备份机器上执行此操作,从源备份到目标备份:
sudo rsync -avi --delete user@10.9.9.3:/var/www/ /media/sdb1/backups/www/
从源计算机执行此操作,从源发送到目标备份:
sudo rsync -avi --delete /media/sdb1/backups/www/ user@10.9.9.3:/var/www/
如果仍然有人提示您输入密码,那么您需要检查 /etc/ssh/sshd_config中的 ssh 配置,并通过使用 ssh-copy-id user@10.9.9.3发送源和目标中的用户,验证它们各自拥有其他用户各自的公共 ssh 密钥。
/etc/ssh/sshd_config
ssh-copy-id user@10.9.9.3
(同样,这是为了使用不带密码的 ssh 密钥对作为替代方法,而 不是是为了通过文件传递密码。)
在命令中公开密码是不安全的,特别是在使用 bash 脚本时,如果您尝试使用密钥文件,那将非常好。 使用 ssh-keygen在主机中创建密钥,并使用 ssh-copy-id "user@hostname.example.com复制公钥,然后使用 rsync addin 选项 -e "ssh -i $HOME/.ssh/(your private key)"通过前面创建的私钥强制使用 ssh 连接进行 rsync。
ssh-copy-id "user@hostname.example.com
-e "ssh -i $HOME/.ssh/(your private key)"
例如:
rsync -avh --exclude '$LOGS' -e "ssh -i $HOME/.ssh/id_rsa" --ignore-existing $BACKUP_DIR $DESTINATION_HOST:$DESTINATION_DIR;
这是一个使用 gpg 加密密码的安全解决方案。
1. 使用以下命令在与 rsync 脚本相同的文件夹中创建一个. secret 文件,其中包含您的密码:
echo 'my-very-secure-password' > .secret
请注意,为了额外的安全性,默认情况下该文件是隐藏的。
2. 使用以下 gpg 命令加密密码文件,并按照提示操作:
gpg -c .secret
这将创建另一个名为. secret. gpg 的文件。您的密码现在已经加密。
3. 删除纯文本密码文件
rm .secret
4. 最后在 rsync 脚本中使用 gpg 和 sshpass,如下所示:
gpg -dq secret.gpg | sshpass rsync -avl --mkpath /home/john user_name@x.x.x.x/home
该示例使用 IP x.x.x.x 将名为 john 的用户的整个主文件夹同步到远程服务器